1. 程式人生 > 實用技巧 >Codeforces Round #304 (Div. 2) C. Basketball Exercise (DP)

Codeforces Round #304 (Div. 2) C. Basketball Exercise (DP)

  • 題意:給你兩個長度相同的陣列,每次從兩個陣列中選數(也可以不選),但是不可以在同一個陣列中連續選兩次,問能選的最大值是多少?

  • 題解:dp,\(dp[i][0]\)表示第\(i\)個位置不選,\(dp[i][1]\)表示第\(i\)個位置選第一個陣列的數,同理\(dp[i][2]\)就是第二個,不選的話,\(dp[i][0]\)可以從上個位置的第一個和第二個的最大值轉移而來,而\(dp[i][1]\)可以從上個位置的第二個陣列或者不選的轉移而來,\(dp[i][2]\)也是同理,具體看程式碼.

  • 程式碼:

    int n;
    ll h1[N],h2[N];
    ll dp[N][3];
    
    int main() {
        ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
        cin>>n;
        for(int i=1;i<=n;++i) cin>>h1[i];
        for(int i=1;i<=n;++i) cin>>h2[i];
    
        for(int i=1;i<=n;++i){
            dp[i][0]=max(dp[i-1][1],dp[i-1][2]);
            dp[i][1]=max(dp[i-1][2]+h1[i],dp[i-1][0]+h1[i]);
            dp[i][2]=max(dp[i-1][1]+h2[i],dp[i-1][0]+h2[i]);
        }
    
        cout<<max({dp[n][0],dp[n][1],dp[n][2]})<<endl;
    
        return 0;
    }