HDU 1003Max Sum

没什么好说的,经典的dp问题,需要考虑一种全为负数的特殊情况,我就被这个坑死了。。。。。。。。。。。

#include<iostream>


      
    #define N 100005  
    int ar[N];  
    int dp[N];  
    int start[N];  
    int t,n;  
    int st,ed;  
      
    int DP()  
    {  
        dp[0]=0;  
		dp[1]=ar[1];
        start[0]=0;  
		start[1]=ar[1];
        st=ed=1;  
        int sttmp=1,edtmp=1;  
        for(int i=2;i!=n+1;i++){  
              
            if(ar[i]>ar[i]+start[i-1]){  
                start[i]=ar[i];  
                sttmp=i;  
                edtmp=i;  
            }else{  
                start[i]=ar[i]+start[i-1];  
                edtmp=i;  
            }  
            if(start[i]>dp[i-1]){  
                dp[i]=start[i];  
                st=sttmp;  
                ed=edtmp;  
            }else{  
                dp[i]=dp[i-1];  
            }  
          
        }  
        return dp[n];  
    }  
      
    int main()  
    {  
        while(std::cin>>t){  
            for(int i=0;i!=t;i++){  
                std::cin>>n;  
                for(int i=0;i!=n;i++){  
                    std::cin>>ar[i+1];  
                }  
                int res=DP();  
                std::cout<<"Case "<<i+1<<":"<<std::endl;  
                std::cout<<res<<" "<<st<<" "<<ed<<std::endl;  
                if(i!=t-1){  
                    std::cout<<std::endl;  
                }  
      
                memset(ar,0,sizeof(ar));  
                memset(dp,0,sizeof(dp));  
                memset(start,0,sizeof(start));  
            }  
        }  
      
          
    }  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值