zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    B/S---控件属性
    Windows Form -----内容(11)
    C#--Web控件简介
    C#控件基本1
    C#增删改小总结
    C#播放器控件的常用方法介绍
    C#封装---小练
    链接SQL、事务---小总结
    事务-----2
    事务----1
  • 原文地址:https://www.cnblogs.com/dilthey/p/7242270.html
Copyright © 2011-2022 走看看