昨天晚上,简直是一场对心脏的强大考验,虽然最后发现的问题不值得一提,但是发现问题的过程,仿佛有一个世纪那么长。对此我只想说,如果你不主动初始化,我们之间就永远不会有AC……
关于动态规划求最大子序列和的问题,我已经写过一遍,但是同样的题目稍微改了一点就发现一直WA,然后由于思维定势,并且之前已经有过AC的经验,所以我总是认为代码是没有问题的,然而在学长们的帮助下,and测试了很多组数据以后终于发现了一组错误的数据,究其原因就是没有给一个标记位置的变量赋初值,然而这一次,我并没有取得最终的AC,于是误打误撞下,我删除了某一句话,神奇的是,竟然成功了,回头看这段代码,和源代码的比对却不能理解AC的原因出自何处,费尽千辛万苦,zy学长终于看出了代码中的破绽……
原来的代码是这样的

#include <iostream>
#include <algorithm>
#define inf 0x3f3f3f3f
using namespace std;
int main()
{

    int k,res,i,t=0,n,cnt=1,m;
    cin>>n;
    while(n--){
    cin>>k;
    m=n;
    int a[123456]={0},dp[123456]={0},st[123456]={0},last[123456]={0};
        res=-inf;

        for(i=0;i<k;i++){
            cin>>a[i];
        }

    dp[0]=a[0];
    st[0]=last[0]=0;
    res=max(dp[0],res);
    for(i=1;i<k;i++){
        if((dp[i-1]+a[i])>=a[i]){
            dp[i]=dp[i-1]+a[i];

            st[i]=st[i-1];
            last[i]=i;
        }else {
            dp[i]=a[i];
            st[i]=last[i]=i;
        }
    }
    for(i=0;i<k;i++){
        if(res<dp[i]){
            t=i;
            res=dp[i];
        }
    }
    cout<<"Case "<<cnt<<":"<<endl;
    cout<<res<<" "<<st[t]+1<<" "<<last[t]+1<<endl;
    if(n)
    cout<<endl;
    cnt++;
    }

    return 0;
}

ac的代码是

#include <iostream>
#include <algorithm>
#define inf 0x3f3f3f3f
using namespace std;
int main()
{

    int k,res,i,t=0,n,cnt=1;
    cin>>n;
    while(n--){
    cin>>k;
    int a[123456]={0},dp[123456]={0},st[123456]={0},last[123456]={0};
        res=-inf;

        for(i=0;i<k;i++){
            cin>>a[i];
        }

    dp[0]=a[0];
    st[0]=last[0]=0;
    for(i=1;i<k;i++){
        if((dp[i-1]+a[i])>=a[i]){
            dp[i]=dp[i-1]+a[i];

            st[i]=st[i-1];
            last[i]=i;
        }else {
            dp[i]=a[i];
            st[i]=last[i]=i;
        }
    }
    for(i=0;i<k;i++){
        if(res<dp[i]){
            t=i;
            res=dp[i];
        }
    }
    cout<<"Case "<<cnt<<":"<<endl;
    cout<<res<<" "<<st[t]+1<<" "<<last[t]+1<<endl;
    if(n)
    cout<<endl;
    cnt++;
    }

    return 0;
}

最后,原因就是t=0的变量初始化应该放在循环里面……所以当删除了给res的赋值之后,引起了t的更新,最后才AC,不然t不变,自然会wa

当然除了这个以外,还有需要注意的就是,数组的下标从1开始写可以减少出错,还有数组开在外面,然后使用memset来重置;