poj1157

今天开始做dp,感觉dp比较考思维能力,关于那个动态转移方程,我一直很好奇人们是怎么推的呢??有没有什么方法呢???

题目大意:

每种花有一个编号,有几个花瓶,花瓶也是有编号的,每种花放在不同的花瓶的艺术价值不一样,要你把这些花按某种策略放在这些花瓶里,得到艺术价值总值最大,并且,编号小的花所在的花瓶的编号要比编号大的花所在花瓶的编号小。  

ans[i][j]表示前i朵花放进前j个瓶子中的艺术值

a[i][j]表示第i多花放在第j个瓶子里面的艺术值

动态转移方程:

ans[i][j]=max(ans[i][j-1],ans[i-1][j-1]+a[i][j]

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 
 5 int max(int a, int b)
 6 {
 7     return a>b?a:b;
 8 }
 9 int main()
10 {
11     int f,v;
12     int a[105][105];
13     int ans[105][105];
14     memset(ans,0,sizeof(ans));
15     cin>>f>>v;
16     for(int i=1;i<=f;i++)
17     {
18         for(int j=1;j<=v;j++)
19         {
20             cin>>a[i][j];
21         }
22         ans[i][i]=ans[i-1][i-1]+a[i][i];
23     }
24     for(int i=1;i<=f;i++)
25     {
26         for(int j=i+1;j<=v;j++)//注意这里是j=i+1,j不可以从i开始
27         {
28             ans[i][j]=max(ans[i][j-1],ans[i-1][j-1]+a[i][j]);
29         }
30     }
31     cout<<ans[f][v]<<endl;
32     return 0;
33 }

代码短小精悍。

 

posted on 2012-08-17 21:22  矮人狙击手!  阅读(816)  评论(0编辑  收藏  举报

导航