题目链接
思路
先判断是否满足含重叠子问题和最优子结构?
从 答案 判断就可以
是答案,不是随便一个子串
就样例来说
例如 1 2 3 4这个子串
把最后一个元素4去掉
就生成了另一子串1 2 3
也就是说
一种状态包含了另一种状态
这种状态是以3结尾的子串的最大值
而初始状态是以4结尾的子串的最大值
则满足重叠子问题
找到了一种状态的关系
接下来再判断该状态是否具有无后效性
就是说
该状态如果被赋值
以后还需要修改吗
如果从左到右给状态赋值的话
是不需要的
则满足无后效性
那满足最优子结构?
也就是
6 (1+2+3)是否是以3为结尾的子串的最值?
是,则满足最优
个人理解
代码
using namespace std;
#include <iostream>
int origin[10010], dp[10010];
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> origin[i];
}
dp[0] = origin[0];
for (int i = 1; i < n; i++) {
dp[i] = max(dp[i - 1] + origin[i], origin[i]);
}
int minid = 0;
for (int i = 1; i < n; i++) {
if (dp[minid] < dp[i])
minid = i;
}
if (dp[minid] < 0) {
cout << '0' << " "<<origin[0] << " " << origin[n - 1];
return 0;
}
int dest = minid;
while (minid>0) {
if (dp[minid] == dp[minid - 1] + origin[minid])
minid--;
else break;
}
cout << dp[dest] <<" "<< origin[minid] << " " << origin[dest];
return 0;
}
/*
6
-2 11 -4 13 -5 -2
*/