杭电1003_Max Sum
这是原题的链接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=;
while(k--){
int m;
cin >> m;
int a[m];
for(int i=;i<m;i++){
cin >> a[i];
}
int tp1=;
int tp2=;
int i,j=;
int sum=;
for(i=;i<m;i++)
{ for( j=;j<=i;j++){
int s=j;
int sum1=;
while(s<=i){
sum1+=a[s];
s++;
}
if(sum1>sum){
sum=sum1;
tp1=j+;
tp2=i+;
}
}
}
cout << "Case " <<++f<<":"<<endl;
cout << sum << " " << tp1 << " " << tp2;
if(k!=){
cout << endl;
}
}
return ;
}
必须换一种方法,考虑用动态规划,具体思路如下:
对于第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[];
int dp[]; int main(){
int k;
cin >> k;
int f=;
while(k--)
{
int a;
cin >> a;
int start=;
int end=;
memset(array1,,sizeof(array1));
memset(dp,,sizeof(dp));
int sum=-;
int i;
for( i=;i<=a;i++)
{
cin >> array1[i];
dp[i]=max(dp[i-]+array1[i],array1[i]);
if(dp[i]>sum){//用来更新sum
sum=dp[i];
end=i;
}
}
int sum1=;
int j;
for( j=end;j>=;j--){//确定起始点
sum1+=array1[j];
if(sum1==sum){
start=j; } }
cout << "Case " <<++f<<":"<<endl;
cout << sum << " " << start << " " << end <<endl;
if(k!=){
cout << endl;
} }
return ;
}
杭电1003_Max Sum的更多相关文章
- 杭电1003-Max Sum
Max Sum Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the ...
- 杭电1024Max Sum Plus Plus
地址:http://acm.hdu.edu.cn/showproblem.php?pid=1024 题目: Problem Description Now I think you have got a ...
- 杭电ACM2058--The sum problem
http://acm.hdu.edu.cn/showproblem.php?pid=2058 以为简单的穷举就完了,结果是一直Time Limit Exceeded.. 这是代码: #include ...
- 杭电1024----Max Sum Plus Plus
/* 这题还没有理解透彻.某个dalao也不写注释.只能自己理解了... 先求为i个元素(1<=i<=M)为一个区间的最大和,保证元素个数大于等于i个,递推到M个即可 借鉴原址:http: ...
- acm入门 杭电1001题 有关溢出的考虑
最近在尝试做acm试题,刚刚是1001题就把我困住了,这是题目: Problem Description In this problem, your task is to calculate SUM( ...
- 杭电ACM分类
杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze ...
- 高手看了,感觉惨不忍睹——关于“【ACM】杭电ACM题一直WA求高手看看代码”
按 被中科大软件学院二年级研究生 HCOONa 骂为“误人子弟”之后(见:<中科大的那位,敢更不要脸点么?> ),继续“误人子弟”. 问题: 题目:(感谢 王爱学志 网友对题目给出的翻译) ...
- 杭电ACM(1002) -- A + B Problem II 大数相加 -提交通过
杭电ACM(1002)大数相加 A + B Problem II Problem DescriptionI have a very simple problem for you. Given two ...
- Help Johnny-(类似杭电acm3568题)
Help Johnny(类似杭电3568题) Description Poor Johnny is so busy this term. His tutor threw lots of hard pr ...
随机推荐
- maven-appfuse配备步骤
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/qiaqia609/article/details/36231851 maven-appfuse配置步 ...
- 蓝牙 CTS 测试
安装蓝牙测试安装包 之后 . 安卓包名字 android-cts-6.0_r19-linux_x86-x86.zip 解压之后 /cts/android-cts/tools/ 目录下 运行 ./ ...
- linux中查看python的安装路径
方法1:whereis python 查看所有python的路径,不止一个 方法2:which python 查看当前使用的python路径
- 【ES6】更易于继承的类语法
和其它面向对象编程语言一样,ES6 正式定义了 class 类以及 extend 继承语法糖,并且支持静态.派生.抽象.迭代.单例等,而且根据 ES6 的新特性衍生出很多有趣的用法. 一.类的基本定义 ...
- CSS那个背景图片的坐标怎么设置?怎么计算的?
background:url(images/hh.gif) no-repeat -10px 0;},作用是移动背景的位置. 背影图片的左上角相对当前元素左上角的坐标. 右为X轴正半轴, 下为Y轴正半轴 ...
- hibernate 一对多 级联 保存修改 删除
一对多,一端设置: <set name="TWorkorderHistories" inverse="true" cascade="all&qu ...
- hihocoder 微软编程之美2015 初赛 第二场(暴力+字典序+图论+思维算法)
题目1 : 扑克牌 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 一副不含王的扑克牌由52张牌组成,由红桃.黑桃.梅花.方块4组牌组成,每组13张不同的面值.现在给定52 ...
- iOS审核策略重磅更新:Guideline 2.1批量拒审
自从进入了2018年,大量应用在AppStore提交审核后,都直接给大家回复了个新春大礼包 Guideline 2.1 - Information Needed. 而大部分的应用,特别是金融类相关AP ...
- ACM学习历程——UVA540 Team Queue(队列,map:Hash)
Description Team Queue Team Queue Queues and Priority Queues are data structures which are know ...
- POJ1797(dijkstra求最短最长边)
Heavy Transportation Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 26442 Accepted: ...