题确实有点不好读,就是v个花瓶f朵花,v>=f,每个花瓶只能插一束花,可以有空的花瓶,但是花得插完,然后那个二维数组就是每束花在不同花瓶的价值,题目要求最大的价值和。 不用我说,都知道是DP,dp[i][j] = max{ dp[i-1][i-1....j-1] } + val[i][j];dp[i][j]表示第i朵花插在第j个瓶上的最大价值。
附带代码参考。
差点忘记了 千万得考虑所以得价值都是负的情况啊,第一次WA就是这原因。
#include<cstdio>
#include<iostream>
#include<cstring>
#define N 101
using namespace std;
int val[N][N];
int f,v;
int dp[N][N];//前面表示第多少束花,后面表示多少个花瓶。
int main()
{
cin >> f >> v;
for(int i=1; i<=f; ++i)
for(int e=1; e<=v; ++e)
{
cin >> val[i][e];
}
for(int i=0; i<=v; ++i)
dp[0][i] = 0;
for(int i=1; i<=f; ++i)
for(int j=i; j<=v-(f-i); ++j)
{
int ma = -1000000;
for(int k=i-1; k<=j-1; ++k)
if(ma < dp[i-1][k])
ma = dp[i-1][k];
dp[i][j] = ma + val[i][j];
}
int ma = -1000000;
for(int i=f; i<=v; ++i)
if(ma < dp[f][i])
ma = dp[f][i];
cout << ma <<endl;
return 0;
}