和最大子序列(动态规划)
问题 1508: [蓝桥杯][算法提高VIP]和最大子序列
时间限制: 1Sec 内存限制: 128MB 提交: 487 解决: 160
题目描述
对于一个给定的长度为N的整数序列A,它的“子序列”的定义是:A中非空的一段连续的元素(整数)。你要完成的任务是,在所有可能的子序列中,找到一个子序列,该子序列中所有元素的和是最大的(跟其他所有子序列相比)。程序要求你输出这个最大值。
输入
输入文件的第一行包含一个整数N,第二行包含N个整数,表示A。
其中
1 < = N < = 100000
-10000 < = A[i] < = 10000
其中
1 < = N < = 100000
-10000 < = A[i] < = 10000
输出
输出仅包含一个整数,表示你算出的答案。
样例输入
5 3 -2 3 -5 4
样例输出
4
#include "stdio.h" #include "stdlib.h" #include "iostream" #include "string.h" #include "math.h" #include "algorithm" #include "queue" #include "vector" #include "map" #define Mod 1000000007 using namespace std; int main(){ int n; scanf("%d", &n); int A[n]; for(int i = 0; i < n; i++){ scanf("%d", &A[i]); } int dp[n + 1]; dp[0] = 0; int t = INT_MIN; for(int i = 1; i <= n; i++){ dp[i] = max(dp[i - 1] + A[i - 1], A[i - 1]); //下面是关于 dp[i] = max(dp[i - 1] + A[i - 1], A[i - 1]);的注解 //dp[i]的值一般情况是连续i项A数组的和 //如果加到A数组的第x项发现还没第A[x]大此时再加就必定不是最大序列了就将dp[x+1]=A[x]; //意味着此时已经中断,重新开始往后寻找序列 t = max(t, dp[i]); } //cout << t << endl; for(int i=1;i<=n;i++) { cout<<dp[i]<<" "; } return 0; }
#include <iostream> #include <cmath> #include <set> #include <algorithm> #include <string> using namespace std; const int maxn=10005; int main() { int a[maxn]; int m; cin>>m; int dp[m+1]; for(int i=0;i<m;i++)cin>>dp[i]; int t=INT_MIN; for(int i=1;i<m;i++) { dp[i]=max(dp[i-1]+dp[i],dp[i]); t=max(t,dp[i]); }cout<<max(t,dp[0])<<endl; for(int i=0;i<m;i++) cout<<dp[i]<<" "; }
不一样的烟火