题目链接:http://poj.org/problem?id=1157
由于花有摆放顺序的限制,即后一种花只能放在前一种花所放的花盆的后面的花盆,所以动态规划的状态转移就比较容易写出来了。
状态dp[i][j]表示的是前i种花放入前j个花盆中时的最大权值。
则dp[i][j]=max{dp[i][j-1],dp[i-1][j-1]+a[i][j]}。
代码如下:
#include<cstdio>
#include<cstring>
using namespace std;
int dp[101][101];
int a[101][101];
int main()
{
int f,v;
scanf("%d%d",&f,&v);
memset(dp,-51,sizeof(dp));
for(int i=1;i<=f;i++)
{
for(int j=1;j<=v;j++)
{
scanf("%d",&a[i][j]);
}
}
dp[1][1]=a[1][1];
for(int i=2;i<=v;i++)
{
int tmp;
if(dp[1][i-1]>a[1][i])
tmp=dp[1][i-1];
else
tmp=a[1][i];
dp[1][i]=tmp;
}//初始化,计算第一种花放到前i个花盆里的最大权值
for(int i=2;i<=f;i++)
{
for(int j=i;j<=v;j++)
{
if(i==j)
dp[i][j]=dp[i-1][j-1]+a[i][j];
else
{
int tmp;
if(dp[i][j-1]>dp[i-1][j-1]+a[i][j])
tmp=dp[i][j-1];
else
tmp=dp[i-1][j-1]+a[i][j];
dp[i][j]=tmp;
}
}
}
printf("%d\n",dp[f][v]);
return 0;
}