题目描述
Nikola 喜欢收集足球队员的照片,并将其保存在相册中。他计划收集 NN 支球队的队员照片,其中每支球队都有 MM 张。
对于 Nikola 所收集的每支球队,该球队的照片数量 xx 能给他增加分数 B_xBx。他目前拥有球队 ii 的照片数量为 P_iPi。
Nikola 的好朋友 Ivan 有两套完整的相册。Ivan 决定送 KK 张照片给 Nikola。Nikola 想要知道,在得到这 KK 张照片之后,它的相册所能得到的分数的最大值。
思路:考虑DP,dp[i][j]:表示在前 ii 支球队中获取 jj 个张照片所获得的最大分数,状态转移方程:dp[i][j]=max(dp[i][j],dp[i-1][j-kk]+b[p[i]+kk]
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define lson 2*p
#define rson 2*p+1
const int N=1000010;
int a[N];
int p[N],b[N];
int n;
int dp[1005][1005];//dp[i]为登上第i级台阶所需要的最小步数
signed main()
{
int m,k;
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
{
cin>>p[i];
}
for(int i=0;i<=m;i++)
{
cin>>b[i];
}
for(int i=1;i<=n;i++)
{
for(int j=0;j<=k;j++)
{
for(int kk=0;kk<=k;kk++)
{
if(j>=kk&&kk+p[i]<=m) dp[i][j]=max(dp[i][j],dp[i-1][j-kk]+b[p[i]+kk]);
}
}
}
int ans=0;
for(int i=0;i<=k;i++) ans=max(ans,dp[n][i]);
cout<<ans<<endl;
// cout<<dp[n][k];
}