题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4939
题目大意:
题目类型:dp
思路:
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int M=1510;
long long dp[M][M];
int main()
{
int T;
long long n,r,b,g,t;
scanf("%d",&T);
for(int ii=1;ii<=T;ii++)
{
memset(dp,0,sizeof(dp));
scanf("%I64d%I64d%I64d%I64d%I64d",&n,&r,&g,&b,&t); //要用long long存这些数,不然会错,就在这个上wa了很多次
for(int i=1;i<=n;i++)
{
dp[i][0]=dp[i-1][0]+(i-1)*g*t;
}
for(int i=1;i<=n;i++)
{
for(int j=1;i+j<=n;j++)
{
dp[i][j]=max(dp[i-1][j]+(j*b+t)*((i-1)*g),dp[i][j-1]+i*g*((j-1)*b+t));
}
}
long long ans=-1;
for(int i=1;i<=n;i++)
{
int k=n-i;
for(int j=0;j<=k;j++)
{
long long temp=dp[j][k-j]+(j*g+r)*(t+b*(k-j))*i;
if(temp>ans)
ans=temp;
}
}
printf("Case #%d: %I64d\n",ii,ans);
}
}