poj 1157 LITTLE SHOP OF FLOWERS

/*

题意: 有n束花和m个花瓶,一束花 i 插在一个花瓶 j 中都有一个对应的美观值 A[i][j],
现在要将这n束花全部插入花瓶中并使得所有的花的美观值最大,求该最大值.
题目规定若i<j,则第i束花必须出现在第j束花之前,
设 ans[i,j] 为前 i 束花插在前 j 个花瓶中的最大美学值,
则有状态转移方程:ans[i,j]=max(ans[i-1,k-1]+A[i,k]),其中i<=k<=j,
A[i,k] 为第 i 束花插在第 k 个花瓶中的美学值,规定ans[0,j]=0,0<=j<=m

*/


#include <iostream> //DP
using namespace std;

int A[105][105],ans[105][105];
#define MIN INT_MIN
int dp(int i,int j) // 求前 i 束花插在前 j 个花瓶中的最大美学值ans[i][j]
{

if(ans[i][j]!=MIN) // 说明ans[i][j]已求解
return ans[i][j];

int t=MIN;
for(int k=i;k<=j;++k)
{
if(dp(i-1,k-1)+A[i][k]>t)
t=dp(i-1,k-1)+A[i][k];
}
ans[i][j]=t;
return ans[i][j];
}
int main()
{
int n,m; //n束花,m个花瓶
cin>>n>>m;

for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
cin>>A[i][j];
fill(&ans[1][1],&ans[n+1][m+1],MIN);
for(int j=0;j<=m;++j)
ans[0][j]=0;
cout<<dp(n,m)<<endl;
return 0;
}

posted on 2011-07-22 19:02  sysu_mjc  阅读(111)  评论(0编辑  收藏  举报

导航