心如止水
Je n'ai pas le temps
posts - 400,comments - 130,trackbacks - 0
采用DP。当前的数字,要么加在之前的若干个数字的后面,要么另外成为一个序列的开头;具体是如何决策,需要比较当前数字t与之前若干数字的和sum的大小。
以下是我的代码:
#include<iostream>
#include
<cstdio>
using namespace std;
const int kInf (200000000);

int main()
{
    
/*
    freopen("data.in","r",stdin);
    freopen("data.out","w",stdout);
    //
*/
    
    
int T;
    cin
>>T;
    
for(int k=1;k<=T;k++)
    {
        
int n;
        
int sum(-kInf),now_left(0),now_right(0);
        
int ans_value(-kInf),ans_left(now_left),ans_right(now_right);
        
        cin
>>n;
        
for(int i=1;i<=n;i++)
        {
            
int t;
            cin
>>t;
            
if(sum+t<t)
            {
                sum
=t;
                now_left
=now_right=i;
            }
            
else if(sum+t==t)
            {
                sum
=t;
                now_right
++;
            }
            
else if(sum+t>t)
            {
                sum
+=t;
                now_right
++;
            }
            
            
if(ans_value<sum || (ans_value==sum && ans_left>now_left) || (ans_value==sum && ans_left==now_left && ans_right>now_right))
            {
                ans_value
=sum;
                ans_left
=now_left;
                ans_right
=now_right;
            }
        }
        
        
if(k!=1) cout<<endl;
        cout
<<"Case "<<k<<":"<<endl;
        cout
<<ans_value<<" "<<ans_left<<" "<<ans_right<<endl;
    }
    
return 0;
}
posted on 2011-03-10 22:03 lee1r 阅读(622) 评论(0)  编辑 收藏 引用 所属分类: 题目分类:动态规划

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理