标签:dp
橱窗布置3 5 7 23 -5 -24 16 5 21 -4 10 23 -21 5 -4 -20 20
53 2 4 5
</pre><div>//设dp[i][j]表示第i种花放在第j个花瓶里可以使前i束花获得的最大美学价值,那么第i-1束花只能放在前j-1个花瓶里,那么只要找到前j-1个花瓶的一个最大美学价值加上当前第i束花放在第j个瓶中的美学价值就是dp[i][j]的值,满足最优化原理和无后效性。</div><div>状态转移方程: dp[i][j]=max(dp[i][j],dp[i-1][k]+a[i][j]) (i<=k<=j-1) </div><div><pre class="cpp" name="code">#include<cstdio>
#include<cstring>
#define inf 10000
int a[105][105],dp[105][105],f,v;
int path[105][105];
void dg(int i,int j,int k) //递归求出路径,k控制格式 从小到大 输出
{
if(i<=0||j<=0) return;
dg(i-1,path[i][j],k+1);
if(k>0)printf("%d ",j);
else printf("%d\n",j);
}
int main()
{
while(scanf("%d%d",&f,&v)!=EOF)
{
memset(dp,128,sizeof(dp)); //初始dp为最小值
memset(path,0,sizeof(path));
dp[0][0]=0; //第0束花在0个瓶子 美学价值为0
for(int i=1;i<=f;i++)
for(int j=1;j<=v;j++)
scanf("%d",&a[i][j]);
for(int i=1;i<=f;i++) //f束花
for(int j=i;j<=v-f+i;j++) //第i束花放在第j个瓶子,那么至少要给剩下f-i束花留这么多个瓶子
for(int k=i-1;k<=j-1;k++) //k是表示第i-1束花可以放在i-1到j-1的瓶子里
if(dp[i-1][k]+a[i][j]>dp[i][j])
{
dp[i][j]=dp[i-1][k]+a[i][j];
path[i][j]=k; //path数组记录了第i-1束花放的位置
}
int ans=f;
for(int i=f+1;i<=v;i++)
{
if(dp[f][i]>dp[f][ans])
ans=i; //求出最大值
}
printf("%d\n",dp[f][ans]);
dg(f,ans,0); //ans为第f束花的位置
}
return 0;
}
标签:dp
原文地址:http://blog.csdn.net/u012773338/article/details/38414445