这题没什么好说的就是一个最大连续和的裸题,只要掌握dp[i]=max(dp[i-1],0)+num[i]即可,记录一下主要是因为我自己写的时候边界条件没处理好,也就是dp[i-1]这里对于0的处理,所以尽量少用dp[i-1]这种形式,用一个变量存就可以了。
/*自己写的不太好*/
#include<string>
#include<cstdlib>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<algorithm>
#include<functional>
#include<iostream>
using namespace std;const int maxn = 10010;int main() {int dp[maxn], a[maxn];int m;bool flag = true;cin >> m;int first = 0, last = m - 1;for (int i = 0; i < m; i++)cin >> a[i];int tem = 0;int res = -1;int temp = 0;for (int i = 0; i < m; i++) {if (tem < 0) {temp = i;tem = a[i];}elsetem = tem + a[i];if (tem > res) {res = tem;last = i;first = temp;}}if (res < 0) {res = 0;cout << res << " " << a[0] << " " << a[m - 1] << endl;}elsecout << res << " " << a[first] << " " << a[last] << endl;return 0;
}
/*参考网上的代码*/
#include<string>
#include<cstdlib>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<algorithm>
#include<functional>
#include<iostream>
using namespace std;int main() {int n;cin >> n;vector<int> v(n); //这里vector的使用可以学习一下int sum = -1, temp = 0, left = 0, right = n - 1, tempindex = 0;for (int i = 0; i < n; i++) {scanf("%d", &v[i]);temp += v[i];if (temp < 0) {temp = 0;tempindex = i + 1; //下一个才能作为左边界}else if (temp>sum) {sum = temp;left = tempindex;right = i;}}if (sum < 0) sum = 0;cout << sum << " " << v[left] << " " << v[right] << endl;return 0;
}