标签:start ble tput clu amp 动态 输出 namespace ios
解题:
状态:dp[i]表示以a[i]结尾的最大连续子序列。那么我们接下来考虑的是转移方程。既然a[i],必不可少,那么唯一可以选择的就是要不要之前的那个最大最大连续子序列。所以转移方程为:dp[i]=max(dp[i-1]+a[i],a[i]);由于题目中要求第一个值和最后一个。我们知道,最后一个肯定是确定的,dp[i]如果最大,i就是最后一个,那么根据第一个连续到最后一个的和为dp[i],可以计算出第一个。
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int a[10020]; int d[10020]; int main() { int m; while (cin >> m&&m){ int flag = 1; for (int i = 0; i < m; i++){ cin >> a[i]; if (flag&&a[i] >=0) flag = 0; } d[0] = a[0]; int maxx = a[0]; int start, end; start = end = 0; if (flag == 0){ for (int i = 1; i <m; i++){ d[i] = max(d[i - 1] + a[i], a[i]); if (d[i]>maxx) { maxx = d[i]; end = i; } } cout << maxx; for (int i = end; i >= 0; i--){ maxx -= a[i]; if (maxx == 0) { start = i; break; } } cout << " " << a[start] << " " << a[end] << endl; } else{ cout << 0 << " " << a[0] << " "<< a[m - 1] << endl; } } return 0; }
标签:start ble tput clu amp 动态 输出 namespace ios
原文地址:http://www.cnblogs.com/leonardju/p/6411437.html