zoukankan      html  css  js  c++  java
  • 【noi 2.6_9268】酒鬼(DP)

    题意:有N瓶酒,不能连续喝>=3瓶的酒,问能喝的最大的酒量。

    解法:同前一题相似,可以f[i][j]表示前i瓶中连续喝了j瓶的最大酒量。
    1.f[i][0]=f[i-1][3] ; 2.i=1或2时,f[i][j]=f[i-1][j-1]+a[i];   3. f[i][3]=mx;也可以只用f[i]。

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<iostream>
     5 using namespace std;
     6 #define N 710
     7 int a[N],f[N][5];
     8 
     9 int mmax(int x,int y) {return x>y?x:y;}
    10 int main()
    11 {
    12     int n;
    13     scanf("%d",&n);
    14     for (int i=1;i<=n;i++)
    15       scanf("%d",&a[i]);
    16     for (int i=1;i<=n;i++)
    17     {
    18       f[i][0]=f[i-1][3];
    19       int mx=f[i][0];
    20       for (int j=1;j<=2;j++)
    21       {
    22         f[i][j]=f[i-1][j-1]+a[i];
    23         mx=mmax(mx,f[i][j]);
    24       }
    25       f[i][3]=mx;
    26     }
    27     printf("%d
    ",f[n][3]);
    28     return 0;
    29 }
    View Code 1

    也可以只用f[i]。f[i]=max(f[i-1],a[i]+f[i-2],a[i]+a[i-1]+f[i-3]);

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<iostream>
     5 using namespace std;
     6 #define N 710
     7 int a[N],f[N];
     8 
     9 int mmax(int x,int y) {return x>y?x:y;}
    10 int main()
    11 {
    12     int n;
    13     scanf("%d",&n);
    14     for (int i=1;i<=n;i++)
    15       scanf("%d",&a[i]);
    16     f[0]=0;
    17     for (int i=1;i<=2;i++) f[i]=f[i-1]+a[i];
    18     for (int i=3;i<=n;i++)
    19       f[i]=mmax(f[i-1],mmax(a[i]+f[i-2],a[i]+a[i-1]+f[i-3]));
    20     printf("%d
    ",f[n]);
    21     return 0;
    22 }
    View Code 2
  • 相关阅读:
    前进篇
    2014年12月14日记
    转载了两篇别人写的话语
    想好了,也决定了
    活着
    c#字典排序
    插值转向
    unity手游使用terrian注意事项
    委托delegate 泛型委托action<> 返回值泛型委托Func<> 匿名方法 lambda表达式 的理解
    推荐博客关于uniy
  • 原文地址:https://www.cnblogs.com/konjak/p/5962739.html
Copyright © 2011-2022 走看看