题意:用若干束花和花瓶,每种花装到对应的花瓶中都有一个相应的观赏价值,给出每种花装到每种花瓶中的观赏值,求出能达到的最大观赏价值。另外,每种花和花瓶都有其序号,序号大的花只能放在序号小的花的后面的花瓶中。
思路:用dp[i][j]表示将前i束花放到前j个花瓶中的最大观赏价值。枚举最后一束花,最后一束花能放到的位置为k,i<=k<=j,所以状态转移方程是
dp[i][j] = max{dp[i-1][k-1] + a[i][k]} (i <= k <= j)
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <ctype.h>
#include <cstring>
#include <string>
#include <queue>
#include <cmath>
#define MAXN 110
#define INF 2147000000
#define pu system("PAUSE")
#pragma comment(linker, "/STACK:16777216");
using namespace std;
int f, v;
int a[MAXN][MAXN];
int dp[MAXN][MAXN];
int main()
{
//freopen("C:/Users/Admin/Desktop/in.txt", "r", stdin);
while(cin >> f >> v)
{
for(int i = 0; i < f; i++)
for(int j = 0; j < v; j++)
{
cin >> a[i][j];
}
for(int i = 1; i <= f; i++)
{
for(int j = i; j <= v; j++)
{
dp[i][j] = -INF;
dp[1][1] = a[0][0];
for(int k = i; k <= j; k++)
{
dp[i][j] = max(dp[i][j], dp[i-1][k-1]+a[i-1][k-1]);
}
}
}
cout << dp[f][v] << endl;
}
return 0;
}