码迷,mamicode.com
首页 > 其他好文 > 详细

杭电1003_Max Sum

时间:2018-10-07 14:45:13      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:代码   space   accept   时间   int start   star   状态   规划   对比   

这是原题的链接http://acm.hdu.edu.cn/showproblem.php?pid=1003

起初我是利用暴力的方法,求出所有序列的和的情况,每取一个序列就和以知道的最大和作对比,取大者。结果超时,代码如下,时间复杂度达到o(n^3)

#include <bits/stdc++.h>

using namespace std;


int main(){
int k;
cin >> k;
int q=k;
int f=0;
while(k--){
int m;
cin >> m;
int a[m];
for(int i=0;i<m;i++){
cin >> a[i];
}
int tp1=0;
int tp2=0;
int i,j=0;
int sum=0;
for(i=0;i<m;i++)
{

for( j=0;j<=i;j++){
int s=j;
int sum1=0;
while(s<=i){
sum1+=a[s];
s++;
}
if(sum1>sum){
sum=sum1;
tp1=j+1;
tp2=i+1;
}
}
}
cout << "Case " <<++f<<":"<<endl;
cout << sum << " " << tp1 << " " << tp2;
if(k!=0){
cout << endl;
}
}
return 0;
}

必须换一种方法,考虑用动态规划,具体思路如下:

    对于第i个数,它只有两种状态,一个是接在前一个队伍的前面,另一个是自己作为队头元素。dp[i]中存放的应该在i位置时i位置所属队伍的值。

    所以统计dp中最大的值就可以知道所有队伍中的最值。据此,只需要保证dp[i]的值最大就可以。
    so 状态转移方程为:dp[i]=max(dp[i-1]+a[i], a[i]);时间复杂度o(n^2),成功accept

代码

#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;
int array1[100002];
int dp[100002];

int main(){
int k;
cin >> k;
int f=0;
while(k--)
{
int a;
cin >> a;
int start=1;
int end=1;
memset(array1,0,sizeof(array1));
memset(dp,0,sizeof(dp));
int sum=-9999;
int i;
for( i=1;i<=a;i++)
{
cin >> array1[i];
dp[i]=max(dp[i-1]+array1[i],array1[i]);
if(dp[i]>sum){//用来更新sum
sum=dp[i];
end=i;
}
}
int sum1=0;
int j;
for( j=end;j>=1;j--){//确定起始点
sum1+=array1[j];
if(sum1==sum){
start=j;

}

}
cout << "Case " <<++f<<":"<<endl;
cout << sum << " " << start << " " << end <<endl;
if(k!=0){
cout << endl;
}

}
return 0;
}

杭电1003_Max Sum

标签:代码   space   accept   时间   int start   star   状态   规划   对比   

原文地址:https://www.cnblogs.com/henuliulei/p/9749992.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!