坑1:注意“ If all the K numbers are negative, then its maximum sum is defined to be 0, and you are supposed to output the first and the last numbers of the whole sequence.”
如果不注意这个要求,结果应该是这样的:
坑2:其实还是这句话,我看到上面的代码有两个测试点没过,首先反应当然是加上判断:如果dp[maxid]<=0,就输出0和原始序列首、尾。但是还有一个测试点没过。
于是我就郁闷了,开始研究为什么。我的理解的过程是这样的:
1.如果最大的序列和是一个数字的话,比如“-10 5 -10 -10”,这样是不是应该输出“5 5”,而不是“5 5 5”,按照这个思路修改,提交后更多测试点没过,只有13分;
2.如果序列里只有0和负数,那是不是输出“0 0 0”,比如,“-1 0 -1”,应该输出“0 0 0”,其实这样想是对的,但是,我在分类的时候,错把它放在了“if(dp[maxid]>=0)”,本来dp数组里都应该是非负数,我还把这个计算也去掉了,允许dp数组中有负数,结果只过了3个测试点,得了9分
其实,对的理解是:
dp[maxid]不是大于0的,为1类,在这一类里,看原始数列是否都是负数,如果都是负数,就按照要求输出“0 首 尾”即可;如果原始序列中有一个是0(只要有一个就成),其他是负数或者0,那么,输出“0 0 0”
正确的代码:
#include<iostream>
using namespace std;
int main()
{
int N;
cin>>N;
int in[N];
int result[N];
int dp[N];
for(int i=0;i<N;++i)
cin>>in[i];
dp[0]=max(in[0],0); //动态规划,初始状态定义
for(int i=1;i<N;++i){
if(dp[i-1]+in[i] < 0)
dp[i]=max(in[i],0);
else
dp[i]=dp[i-1]+in[i];
}
//至此,dp(dynamic programming)数组结束
int maxid=0;
for(int i=0;i<N;++i) //这个循环:找最大的序列和
{
if(dp[i]>dp[maxid])
maxid=i;
}
if(dp[maxid]>0){
int temp=maxid;
int i=0;
while(dp[temp]>0){
result[i]=in[temp];
--temp;
++i;
}
cout<<dp[maxid]<<" "<<result[i-1]<<" "<<result[0]<<endl;
}
else{
int j;
for(j=0;j<N;++j)
{
if(in[j]==0)
break;
}
if(j<N-1||in[N-1]==0)
cout<<"0 0 0"<<endl;
else
cout<<"0 "<<in[0]<<" "<<in[N-1]<<endl;
}
return 0;
}