首页 > 代码库 > 某种数列问题 (一场欢乐赛的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)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。