zoukankan      html  css  js  c++  java
  • 51nod——2487小b和环

       dp[ i ][ 0 ] : 第i个位置不取

       dp[ i ][ 1 ] : 第i个位置取

       这样就可以得到状态转移方程:

    dp[i][0]=max(max(dp[i][0],dp[i-1][1]),dp[i-1][0]);//这位置不选则前面位置可选可不选
    dp[i][1]=max(dp[i][1],dp[i-1][0]+a[i]); 这位置选则前面位置必不选

    然鹅要保证1和n不能相邻嘛,所以就跑两边。一遍不选1,n可选可不选,一遍选1,n必不选。这三个情况取max。
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 #define maxn 50050
     4 int dp[maxn][2],a[maxn];
     5 int main(){
     6     ios::sync_with_stdio(0);
     7     cin.tie(0); cout.tie(0);
     8     int n; cin>>n;
     9     for(int i=0;i<n;i++) cin>>a[i];
    10     //不选第一个
    11     dp[1][0]=0,dp[1][1]=a[1];
    12     for(int i=2;i<n;i++){
    13         dp[i][0]=max(max(dp[i][0],dp[i-1][1]),dp[i-1][0]);
    14         dp[i][1]=max(dp[i][1],dp[i-1][0]+a[i]);
    15     }
    16     int ans=max(dp[n-1][0],dp[n-1][1]);
    17     //选第一个,第二个一定不选
    18     memset(dp,0,sizeof(dp));
    19     dp[1][0]=dp[1][1]=a[0];
    20     for(int i=2;i<n;i++){
    21         dp[i][0]=max(max(dp[i][0],dp[i-1][1]),dp[i-1][0]);
    22         dp[i][1]=max(dp[i][1],dp[i-1][0]+a[i]);
    23     }
    24     ans=max(ans,dp[n-1][0]);
    25     cout<<ans<<endl;
    26     return 0;
    27 }
  • 相关阅读:
    zoj 1239 Hanoi Tower Troubles Again!
    zoj 1221 Risk
    uva 10192 Vacation
    uva 10066 The Twin Towers
    uva 531 Compromise
    uva 103 Stacking Boxes
    稳定婚姻模型
    Ants UVA
    Golden Tiger Claw UVA
    关于upper、lower bound 的探讨
  • 原文地址:https://www.cnblogs.com/noobimp/p/10958020.html
Copyright © 2011-2022 走看看