首页 > 代码库 > 某种数列问题 (一场欢乐赛的T2)

某种数列问题 (一场欢乐赛的T2)

  

技术分享

技术分享

 

 

 

  个人觉得挺难的一道DP题

  不会

  没有思路

  于是去找的正解

  于是。。

  

#include <iostream>
#include <cstring>
#define Max 1000010
using namespace std;
int N;
int number [Max];
int dp [Max][4][2];  // dp[i][j][1 or 0] 表示是第i个妹子  在第j段   0表示不放  1表示放 
inline int max (int a, int b) 
{
    return a > b ? a : b;
}
int main()
{
    ios :: sync_with_stdio (false);
    cin >> N;
    for (int i = 1; i <= N; i++)
        cin >> number [i];
    for (int i = 1; i <= N; i++)  // 枚举每个妹子 
        for (int j = 0; j <= 3; j++)  // 枚举 每一段 
        {
            dp [i][j][0] = max (dp [i - 1][j][0], dp[i - 1][j][1]);  
            /* 表示的是 第i个妹子 在第 j段不放的价值  等与前一个妹子在第j段放 or 不放的价值取大 */
            if (j != 0)    dp [i][j][1] = max (dp [i - 1][j - 1][0], dp [i - 1][j - 1][1]) + number [i];
            /* 第0段(即j = 0 ) 表示的是 割过几个 妹子的价值*/
            /* 如果不是第0段  那个当前妹子放入第j段的价值就是 前一个妹子放或不放入第 j 段的价值取大 */ 
            dp [i][j][1] = max (dp [i][j][1], dp [i - 1][j][0] + number [i]);
            /* 第i个妹子放在第j段 的价值为当前价值 与 前一个妹子不放在第j段 于是另开一段后新加上当前妹子的价值*/
        }
    int Answer = max (dp [N][3][1], dp [N][3][0]);
    cout << Answer;
    return 0;
}

 

某种数列问题 (一场欢乐赛的T2)