标签: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