POJ 1157

据说是经典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
",dp[F][V]);
22     }
23 }
原文地址:https://www.cnblogs.com/dilthey/p/7242270.html