码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 1157 - LITTLE SHOP OF FLOWERS

时间:2017-07-26 23:29:44      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:value   nbsp   ems   ttl   ring   ==   div   i++   经典dp   

据说是经典dp问题?

对于每个a[i][j],表示第 i 种花放在第 j 个花瓶里时产生的美学价值(aesthetic value),

我们用dp[i][j]表示共 i 种花放到 j 个花瓶里,产生的最大美学价值(显然这需要i<=j)。

那么我们的答案也很简单,就是dp[F][V]。

那么接下来就是状态转移方程,

因为每个dp[i][j]:共 i 种花放到 j 个花瓶里,都有两种情况:

  ①第 i 种花放到第 j 个花瓶里,那么显然,前面的 i - 1 种花,就只能放到 j - 1 个瓶里,可以表示成 dp[i-1][j-1] + a[i][j];

  ②第 i 种花放不到第 j 个花瓶里,那么显然,总共 i 种花,就只能放到 j - 1 个瓶里,可以表示成 dp[i][j-1];

两种情况中大的那个,就是dp[i][j],即 dp[i][j]  = max( dp[i-1][j-1] + a[i][j] , dp[i][j-1] );

可以说是很巧妙的思路了。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #define MAX 105
 5 using namespace std;
 6 int F,V,dp[MAX][MAX],a[MAX][MAX];
 7 int main()
 8 {
 9     while(scanf("%d%d",&F,&V)!=EOF)
10     {
11         memset(dp,0,sizeof(dp));
12         for(int i=1;i<=F;i++) for(int j=1;j<=V;j++) scanf("%d",&a[i][j]);
13         for(int i=1;i<=F;i++)
14         {
15             for(int j=i;j<=V;j++)
16             {
17                 if(j==i) dp[i][j]=dp[i-1][j-1]+a[i][j];
18                 else dp[i][j]=max(dp[i][j-1],dp[i-1][j-1]+a[i][j]);
19             }
20         }
21         printf("%d\n",dp[F][V]);
22     }
23 }

 

POJ 1157 - LITTLE SHOP OF FLOWERS

标签:value   nbsp   ems   ttl   ring   ==   div   i++   经典dp   

原文地址:http://www.cnblogs.com/dilthey/p/7242270.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!