花瓶插花,比较水的题目。dp[i][j]前i朵花插入前j个花瓶得到的最大价值。
关键就是第i朵花的归属问题。必然是dp[i][j]=maxi(dp[i][j-1],dp[i-1][j]+value[i][j]),要用这个的前提就是j-1>=i。下面是代码。
#include<iostream>
using namespace std;
int value[105][105];
int dp[105][105];
int maxi(int a,int b)
{
if(a>b)
return a;
else return b;
}
int main()
{
int F,V,i,j;
while(cin>>F>>V)
{
for(i=1;i<=F;i++)
for(j=1;j<=V;j++)
cin>>value[i][j];
for(i=1;i<=F;i++)
dp[i][0]=0;
for(j=1;j<=V;j++)
dp[0][j]=0;
for(i=1;i<=F;i++)
for(j=i;j<=V;j++)
{
if(j-1>=i)
dp[i][j]=maxi(dp[i][j-1],dp[i-1][j-1]+value[i][j]);
else dp[i][j]=dp[i-1][j-1]+value[i][j];
}
cout<<dp[F][V]<<endl;
}
return 0;
}