您的位置:首页 > 运维架构

PKU 1157 LITTLE SHOP OF FLOWERS

2010-07-30 15:56 246 查看
动态规划的题目,找到最合适的插花位置,首先这是一个分段决策问题,我一开始做的思路是,通过一个遍历插第i朵花的时候,在第j个花瓶中遍历的去找,只要超过v-(f-i-1)就行,但是现在想一想,我知道自己错在哪里了,我所想的思路是一个不可逆的过程,也许当前最优的选择不一定是最后最优的选择。

改正思路,对于dp[i][j]来说,状态转移方程应该是dp[i][j]=max(dp[i-1][k])+value[i][j];也就是在将第i只花插入第j只花瓶。前i-1只花是最大值max(dp[i-1][k])是对于i-1只花寻找其美观值最大的花瓶位置。当i等于最后一只花时,前面的花都已经安排好。通过遍历找到最后一只的最大值dp[i][j]最大那个就是答案!

代码如下:

]#include <iostream>
#define maxn 105
using namespace std;
int main()
{
int value[maxn][maxn];
int f,v;
int i,j;
int dp[maxn][maxn];
while(cin>>f>>v)
{
for(i=0;i<f;i++)
{
for(j=0;j<v;j++)
{
//cout<<i<<j<<endl;
scanf("%d",&value[i][j]);
}
}
memset(dp,0,sizeof(dp));
for(i=0;i<v;i++)
{
dp[0][i]=value[0][i];
}
/*for(i=0;i<v;i++)
{
cout<<dp[0][i]<<endl;
}*/
int max=-50000000;
for(i=1;i<f;i++)
{
for(j=i;j<v;j++)
{
max=-5000000;
for(int k=i-1;k<j;k++)
{
//cout<<dp[i-1][k]<<"  "<<i<<j<<k<<endl;
if(max<dp[i-1][k])
{
//cout<<dp[i-1][k]<<"//(-o-)/"<<value[i][j]<<endl;
max=dp[i-1][k];
}
}
dp[i][j]=max+value[i][j];
}
}
int ans=-50000000;
for(i=f-1;i<v;i++)
{
if(ans<dp[f-1][i])
ans=dp[f-1][i];
}
cout<<ans<<endl;

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: