据说是经典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
原文:http://www.cnblogs.com/dilthey/p/7242270.html