HDU 1003 Max Sum && HDU 1231 最大连续子序列 (DP)
Max Sum
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 154155 Accepted Submission(s): 35958
5 6 -1 5 4 -7
7 0 6 -1 1 -6 7 -5
14 1 4
Case 2:
7 1 6
最大连续子序列
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 20109 Accepted Submission(s): 8884
Nj },其中 1 <= i <= j <= K。最大连续子序列是所有连续子序列中元素和最大的一个,
例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和
为20。
在今年的数据结构考卷中,要求编写程序得到最大和,现在增加一个要求,即还需要输出该
子序列的第一个和最后一个元素。
素,中间用空格分隔。如果最大连续子序列不唯一,则输出序号i和j最小的那个(如输入样例的第2、3组)。若所有K个元素都是负数,则定义其最大和为0,输出整个序列的首尾元素。
-2 11 -4 13 -5 -2
10
-10 1 2 3 4 -5 -23 3 7 -21
6
5 -8 3 2 5 0
1
10
3
-1 -5 -2
3
-1 0 -2
0
10 1 4
10 3 5
10 10 10
0 -1 -2
0 0 0
Hint
Huge input, scanf is recommended.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 100005 int main(void)
{
int t,n,count;
int dp[MAX];
int max,start,START,end;
count = ; scanf("%d",&t);
while(t --)
{
count ++; scanf("%d",&n);
for(int i = ;i < n;i ++)
scanf("%d",&dp[i]); max = dp[];
start = START = end = ; for(int i = ;i < n;i ++)
{
if(dp[i - ] < && dp[i - ] != dp[i]) //讨论dp[i-1]小于0和大于等于0两种情况即可,后面的条件是为了符合题意
start = i + ; //更新起点
else if(dp[i - ] >= )
dp[i] = dp[i - ] + dp[i]; //隐式地更新终点 if(max < dp[i])
{
START = start;
max = dp[i];
end = i + ;
}
}
printf("Case %d:\n",count);
printf("%d %d %d\n",max,START,end);
if(t)
puts("");
} return ;
}
max sum
上面的代码我用了两个循环,下面这个版本只用了一个,速度反而没第一个快,不知为何。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 100005 int main(void)
{
int t,n,count;
int dp[MAX];
int max,start,START,end;
count = ; scanf("%d",&t);
while(t --)
{
count ++; scanf("%d",&n);
for(int i = ;i < n;i ++) //在读入的时候就顺便处理,不知为何会更慢
{
scanf("%d",&dp[i]);
if(!i)
{
max = dp[];
start = START = end = ;
}
else if(dp[i - ] < && dp[i - ] != dp[i])
start = i + ;
else if(dp[i - ] >= )
dp[i] = dp[i - ] + dp[i]; if(max < dp[i])
{
START = start;
max = dp[i];
end = i + ;
}
} printf("Case %d:\n",count);
printf("%d %d %d\n",max,START,end);
if(t)
puts("");
} return ;
}
max sum_2
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 10005 int main(void)
{
int k;
int dp[MAX],s[MAX],max,max_start,max_end,start; while(scanf("%d",&k) && k)
{
for(int i = ;i < k;i ++)
scanf("%d",&s[i]); max = s[];
dp[] = s[];
max_start = max_end = start = ; for(int i = ;i < k;i ++)
{
if(dp[i - ] < && s[i] != dp[i - ]) //一样的讨论是否为负就行了
{
start = i;
dp[i] = s[i];
}
else if(dp[i - ] >= )
dp[i] = dp[i - ] + s[i]; if(dp[i] > max)
{
max = dp[i];
max_start = start;
max_end = i;
}
} if(max < )
{
max = ;
max_start = ;
max_end = k - ;
}
printf("%d %d %d\n",max,s[max_start],s[max_end]);
} return ;
}
最大连续子序列
这题还有下面这个版本,就是用个双重循环来选出起点和终点,然后就算这个区间的值,可以用一个循环算出以1为起点的值,然后再计算的时候就可以用这个数组推出来,感觉挺不错的,也有DP的思想在里面,虽然超时了。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 10005 int main(void)
{
int k,i,j;
long long s[MAX],dp[MAX],box,max,max_i,max_j; while(scanf("%d",&k) && k)
{
scanf("%lld",&dp[]);
s[] = dp[];
for(int i = ;i < k;i ++)
{
scanf("%lld",&dp[i]);
s[i] = dp[i];
dp[i] += dp[i - ]; //DP[i]保存以1为起点i为终点的区间的值
} max = dp[];
max_i = max_j = ;
for(int i = ;i < k;i ++)
for(int j = i;j < k;j ++)
{
if(i)
box = dp[j] - dp[i - ]; //i...j区间的值等于1...j的值减去1...i-1的值
else
box = dp[j]; if(box > max)
{
max = box;
max_i = i;
max_j = j;
}
} if(max < )
{
max = ;
max_i = ;
max_j = k - ;
}
printf("%lld %lld %lld\n",max,s[max_i],s[max_j]);
} return ;
}
最大连续子序列_2
HDU 1003 Max Sum && HDU 1231 最大连续子序列 (DP)的更多相关文章
- HDU 1003 Max Sum【动态规划求最大子序列和详解 】
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- HDU 1003 Max Sum --- 经典DP
HDU 1003 相关链接 HDU 1231题解 题目大意:给定序列个数n及n个数,求该序列的最大连续子序列的和,要求输出最大连续子序列的和以及子序列的首位位置 解题思路:经典DP,可以定义 ...
- HDOJ(HDU).1003 Max Sum (DP)
HDOJ(HDU).1003 Max Sum (DP) 点我挑战题目 算法学习-–动态规划初探 题意分析 给出一段数字序列,求出最大连续子段和.典型的动态规划问题. 用数组a表示存储的数字序列,sum ...
- HDU 1231.最大连续子序列-dp+位置标记
最大连续子序列 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- hdu 1003 Max Sum (DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003 Max Sum Time Limit: 2000/1000 MS (Java/Others) ...
- hdu 1003 MAX SUM 简单的dp,测试样例之间输出空行
测试样例之间输出空行,if(t>0) cout<<endl; 这样出最后一组测试样例之外,其它么每组测试样例之后都会输出一个空行. dp[i]表示以a[i]结尾的最大值,则:dp[i ...
- HDU 1003 Max Sum (动规)
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- hdu 1003 Max sum(简单DP)
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem ...
- HDU 1003 Max Sum 解题报告
题目大意:求一串数字中,几个连续数字加起来最大值,并确定起始和最末的位置. 思路:这是一题DP题,但是可以用尺取法来做.我一开始不会,也是看了某大神的代码,然后有人告诉我这是尺取法,现在会了. //尺 ...
随机推荐
- Javascript 正则表达式校验数字
$("input[datatype=number]").blur(function () { var str = $(this).val( ...
- 如何设置Grunt
原文地址: Step 1: Install Node.js Download a Node installer and run it. Installation packages are availa ...
- OC:NSmuber、NSString 的互转
NSmuber 转化为 IOS 中的 NSString 假设现有一NSNumber的变量A,要转换成NSString类型的B 方法如下: NSNumberFormatter* numberFormat ...
- Spring中的设计模式
[Spring中的设计模式] http://www.uml.org.cn/j2ee/201301074.asp [详解设计模式在Spring中的应用] [http://www.geek521.c ...
- MFC 构建、消亡 顺序 (二)--多文档 (MDI)
MFC 构建.消亡 顺序 (二)--多文档 (MDI) by:http://www.cnblogs.com/vranger/ (一)MDI 生成顺序 (二)打开文档-“Open” (三)新建文档-“N ...
- 导入flash 逐帧动画
只要图片是一序列的,比如0001-0100,就可以使用导入素材功能,选择第一张图片,选中影片剪辑并编辑然后点击导入到舞台,然后FlashCS6工具就会问你,这是一序列图片,是否逐帧导入,点是,就ok了 ...
- jquery单选框 复选框表格高亮 选中
单选框: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/T ...
- MFC 学习 之 工具栏的添加(一)
最终实现的效果图: 步骤一:接下来在资源视图中添加一个ToolBar工具栏(具体怎么添加在这儿就不详细讲解了!)添加后的ToolBar以及工具栏中每个按钮 所命名的ID如下:(可以自定义,只要不重名就 ...
- STM32 使用 printf 发送数据配置方法 -- 串口 UART, JTAG SWO, JLINK RTT
STM32串口通信中使用printf发送数据配置方法(开发环境 Keil RVMDK) http://home.eeworld.com.cn/my/space-uid-338727-blogid-47 ...
- JS原生方法实现jQuery的ready()
浏览器加载页面的顺序: 1. 解析HTML结构 2. 加载外部脚本和样式表文件 3. 解析并执行脚本代码 4. 构造HTML DOM模型==ready() 5. 加载图片等组件 6. 页面加载完毕== ...