如果你不主动初始化,我们之间就永远不会有AC

来源:互联网 发布:88cc info com新域名 编辑:程序博客网 时间:2024/04/29 22:46

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

#include <iostream>#include <algorithm>#define inf 0x3f3f3f3fusing 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 0x3f3f3f3fusing 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来重置;

0 0
原创粉丝点击