http://acm.hdu.edu.cn/showproblem.php?pid=2670
DP题,虽然之前做了一些DP题目,但是 做到这是还是需要参考别人的代码。
动态方程为;dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]+love[i]-(i-1)*dec[i]);
这之前需要按dec的值按递减排序,可以减少损失。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int dp[1005][1005];
struct chang{
int love;
int dec;
}p[1005];
int max(int a,int b)
{
return a>b?a:b;
}
int cmp(chang a,chang b)
{
return a.dec>b.dec;
}
int main()
{
int s,n;
while(scanf("%d%d",&s,&n)!=EOF)
{
int i,j;
for(i=1;i<=s;i++)
scanf("%d",&p[i].love);
for(i=1;i<=s;i++)
scanf("%d",&p[i].dec);
sort(p+1,p+s+1,cmp);
memset(dp,0,sizeof(dp));
for(i=1;i<=s;i++)
{
for(j=1;j<=i&&j<=n;j++)
dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]+p[i].love-(j-1)*p[i].dec);
}
printf("%d\n",dp[s][n]);
}
return 0;
}