您的位置:首页 > 其它

POJ 1157 动态规划

2014-07-17 11:48 295 查看
题意:用若干束花和花瓶,每种花装到对应的花瓶中都有一个相应的观赏价值,给出每种花装到每种花瓶中的观赏值,求出能达到的最大观赏价值。另外,每种花和花瓶都有其序号,序号大的花只能放在序号小的花的后面的花瓶中。

思路:用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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: