poj 1157 LITTLE SHOP OF FLOWERS

本文介绍了一个关于花瓶插花美学值的最大化问题,通过动态规划的方法解决如何将n束花分配到m个花瓶中以获得最大的美学价值。文章提供了完整的C++代码实现,展示了状态转移方程及求解过程。
/*

题意: 有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;
}

转载于:https://www.cnblogs.com/mjc467621163/archive/2011/07/22/2114272.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值