分值 : 25 难度 : 中等题 思路 : 动态规划 + 边界细节问题 坑点 : 题干要读清楚,然后要考虑清楚 max的初值,如果我手动设置max = 0 , 那么之后sum小于等于0(全是负数和零的输入)就会使得start和end不 更新全部指向在第一个数字,因此max不能设死,要设成活的数字:我把它 设成了第一个数字。 评语 : 最简单的DP加上边界问题也能玩出新花样
12345678910111213141516171819202122232425262728293031323334353637383940414243444546
#include <iostream>using namespace std ;int main() { int N ; cin >> N ; int flag=0 ; int data[N] ; for(int i=0 ; i <N ; i++) { cin >> data[i] ; if(data[i] >= 0) flag = 1 ; } int sum = 0 ; int max = data[0]; int start =data[0],end=data[0] ; int tmp_start =data[0]; int tmp_end = data[0] ; for(int i = 0 ; i < N ; i++) { if(sum >= 0 ) { sum+= data[i] ; tmp_end = data[i] ; } else if(sum < 0 ) { sum = data[i] ; tmp_start = data[i] ; tmp_end = data[i]; } if(sum > max ) { max = sum ; start = tmp_start ; end = tmp_end ; } } if(flag) cout << max << " "<< start <<" " <<end <<endl ; else { cout<< "0"<<" "<<data[0]<<" "<<data[N-1]<<endl; }}