最大子串和
厦门大学复试机试题
题目描述
Time Limit: 1000 ms
Memory Limit: 256 mb
输入n个整数的序列,求它的最大子串和,并输出对应的数。
输入输出格式
输入描述:
多组测试数据。 第一行输入一个整数n(0<n<=100)。 接下来一行输入n个数用空格隔开,保证每个数的绝对值小于1000。
输出描述:
第一行输出所求子串的序列,如果有多个答案,输出靠前的答案。 第二行输出最大子串和。
输入输出样例
输入样例#:
5 -10 5 2 -8 7
输出样例#:
5 2 7
解题方法
思路
动态规划思想
dp[i]代表以v[i]为结尾的 最大子串和的node结点(包括vector容器装所包含的数字以及总和sum)
代码
#include <bits/stdc++.h>
using namespace std;
struct node{
vector<int> v;
int sum;
};
int main(){
int n,maxSum;
vector<int> res;
while(cin>>n){
vector<int> v(n);
for(int i=0;i<n;i++){
cin>>v[i];
}
vector<node> dp(n);
(dp[0].v).push_back(v[0]);
res.push_back(v[0]);//初始化
maxSum = dp[0].sum = v[0];
for(int i=1;i<n;i++){
if(dp[i-1].sum>0){
dp[i].v = dp[i-1].v;
(dp[i].v).push_back(v[i]);
dp[i].sum = dp[i-1].sum+v[i];
}else{
(dp[i].v).push_back(v[i]);
dp[i].sum = v[i];
}
if(maxSum<dp[i].sum){
maxSum = dp[i].sum;
res = dp[i].v;
}
}
for(int i=0;i<res.size();i++){
cout<<res[i]<<" ";
}
cout<<endl<<maxSum<<endl;
}
return 0;
}