hdu1003最长连续子序列和dp

来源:互联网 发布:macbook装windows教程 编辑:程序博客网 时间:2024/04/30 23:23

我已经WA了七遍了…依旧没有找到问题!

#include<iostream>using namespace std;#include<algorithm>#include<string.h>int main(){    int t;    scanf("%d",&t);    int c;    for(c=1;c<=t;c++)    {        printf("Case %d:\n",c);        int n;        scanf("%d",&n);        int num[100005];        int i;        for(i=0;i<n;i++)            scanf("%d",&num[i]);        int dp[100005];        memset(dp,0,sizeof(dp));        int start,end;        start=1;        int ans=-99999999;        dp[0]=num[0];        for(i=1;i<n;i++)        {            if(dp[i-1]+num[i]>=num[i])            {                dp[i]=dp[i-1]+num[i];                if(dp[i]>ans)                {                    ans=dp[i];                    end=i+1;                }            }            else            {                dp[i]=num[i];                if(dp[i]>ans)                {                    ans=dp[i];                    start=i+1;                    end=i+1;                }            }        }        printf("%d %d %d\n",ans,start,end);    }    return 0;}

终于A了!虽然我还是没有找到问题…

#include<iostream>using namespace std;#include<algorithm>#include<string.h>int main(){    int t;    scanf("%d",&t);    int c;    for(c=1;c<=t;c++)    {        printf("Case %d:\n",c);        int n;        scanf("%d",&n);        int num[100005];        int i;        for(i=0;i<n;i++)            scanf("%d",&num[i]);        int dp[100005];        memset(dp,0,sizeof(dp));        int start,end;        start=1;        end=1;        int ans=num[0];        dp[0]=num[0];        int flag=1;        for(i=1;i<n;i++)        {            if(dp[i-1]+num[i]>=num[i])                dp[i]=dp[i-1]+num[i];                       else                        {                dp[i]=num[i];                flag=i+1;            }            //这个if-else实现的就是dp的过程,因为else的情况起点就变了,所以多了一个变量flag来记录这个变化。            if(dp[i]>ans)            {                ans=dp[i];                end=i+1;                start=flag;            }               //统一更新max跟start、end        }        printf("%d %d %d\n",ans,start,end);        c==t?printf(""):printf("\n");       }    return 0;}

嗯,这个差不多可以说是最长连续子序列和实现的最清晰的代码版本了!

原创粉丝点击