CodeUp
http://codeup.cn/problem.php?cid=100000626&pid=0
这道题目需要返回首尾数字
这个问题常见方法有:
- 三层for循环暴力比较法
- 递归法
- 动态规划方法
这里是递归思路的解法:
关键点是:如果以前一个数为尾的 “最大子序列和” 小于0, 那么加上当前这个数后肯定比当前这个数小,还不如直接舍去;
如果以前一个数为尾的 “最大子序列和” 不小于0,那么加上当前这个数后肯定不会比当前这个数小,所以就加上。
#include <iostream>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
vector<int> numVec, preVec, sumVec;
int main(){
int K;
while(cin >> K){
if(K == 0)
break;
numVec.resize(K,0);//用来存储输入的数组
preVec.resize(K,0);//用来指示该数是否是所在序列和最大的序列的第一个数
sumVec.resize(K,0);//用来存储以这个数为尾的 最大序列和
for(int i = 0; i < K; ++i)//输入
cin >> numVec[i];
sumVec[0] = numVec[0]; //初始化
int maxSum = -1, maxIndex = K-1;
for(int i = 1; i < K; ++i){
if(sumVec[i-1] >= 0){//如果以前一个数为尾的 最大序列和 不小于0,就更新以现在这个数为尾的最大序列和
preVec[i] = i-1;
sumVec[i] = sumVec[i-1] + numVec[i];
}else{//否则 直接以该数作为 “以这个数为尾的最大序列和”
sumVec[i] = numVec[i];
preVec[i] = i;
}
if(sumVec[i] > maxSum){//如果当前最大序列和更大 就更新
maxSum = sumVec[i];
maxIndex = i;
}
}
int tmpIndex = maxIndex;
while(preVec[tmpIndex] != tmpIndex)//查找首坐标
tmpIndex--;
if(maxSum < 0){//特殊处理所有的数都小于0的情况
tmpIndex = 0;
maxSum = 0;
}
cout << maxSum << " " << numVec[tmpIndex] << " " << numVec[maxIndex] << endl;
}
return 0;
}