dp[i]表示在i处开餐馆能够获得的最大利润。
一开始想错思路了,以为是0/1背包问题,怎么都套不上。。。实在想不通去百度,发现应该类似最大子序列和,条件由相邻变成相隔k
事实证明建模真的很重要 T T
#include<iostream>
#include<string.h>
using namespace std;
int m[101],p[101],dp[101];
void solve()
{
int n,k,i,j,ans;
cin>>n>>k;
memset(dp,0,sizeof(dp));
for (i=0;i<n;i++)
cin>>m[i];
for (i=0;i<n;i++)
cin>>p[i];
ans=p[0];
for (i=0;i<n;i++)
{
dp[i]=p[i];
for (j=0;j<i;j++)
if (m[i]-m[j]>k)
dp[i]=max(dp[j]+p[i],dp[i]);
ans=max(ans,dp[i]);
}
cout<<ans<<endl;
}
int main()
{
int t;
cin>>t;
while(t--)
solve();
return 0;
}
本文介绍了一种使用动态规划解决餐厅选址问题的方法。该问题的目标是在一系列位置中选择合适的位置开设餐厅,并确保所选位置之间的距离大于一定阈值k,以最大化总利润。通过迭代更新动态规划数组dp来实现这一目标。

341

被折叠的 条评论
为什么被折叠?



