HDU 1003 解题报告
2014-04-04 21:45
267 查看
问题描述:求最大连续字串
分析:一道简单的DP,状态转移方程是d[i] = ( d[i-1]+a[i] > a[i] ) ? d[i-1]+a[i] : a[i]
d[i]表示以第i个数字结尾的连续字串的最大值,限制条件是 d[0]=0
题目要求找出最大连续字串的首尾序号,尾序号显然是d[i]的下标 i ,首序号用数组start[i]保存,point是保存首序号的临时量,注意point初值是1
还有一点,最后一组数据输出完换行后不能再打印空行,否则会判 Presentation Error
分析:一道简单的DP,状态转移方程是d[i] = ( d[i-1]+a[i] > a[i] ) ? d[i-1]+a[i] : a[i]
d[i]表示以第i个数字结尾的连续字串的最大值,限制条件是 d[0]=0
题目要求找出最大连续字串的首尾序号,尾序号显然是d[i]的下标 i ,首序号用数组start[i]保存,point是保存首序号的临时量,注意point初值是1
还有一点,最后一组数据输出完换行后不能再打印空行,否则会判 Presentation Error
#include<cstdio> int a[100005],start[100005],d[100005],T; int main() { scanf("%d",&T); int t=0; while(++t<=T) { printf("Case %d:\n",t); int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); int point=1; d[0]=0; for(int i=1;i<=n;i++) { if(d[i-1]+a[i]>a[i]) { d[i]=d[i-1]+a[i]; start[i]=point; } else { d[i]=a[i]; start[i]=point=i; } } int max=d[1],ins=1; for(int i=2;i<=n;i++) { if(d[i]>max) { max=d[i];ins=i; } } printf("%d %d %d\n",max,start[ins],ins); if(t<T) printf("\n"); } }
相关文章推荐
- WOJ 1546 Maze 图论上的状态压缩DP
- The type JOptionPane is not accessible due to restriction on required library
- 例说SQL Server 2008 聚合函数
- c# thread.join()的用法
- CserialPort串口类最新修正版(解决关闭问题)2011-11-04
- #include<unistd.h>头文件的理解
- ios教程 socket开发
- POJ 1061 青蛙的约会(扩展欧几里德)
- C#中的using和yield return混合使用
- NYOJ655 光棍的yy【大数】【斐波那契】
- 鼠标控制绘图
- linux系统之sudo用法
- Hdu 4143
- 第一篇扯蛋
- vlc-android源码编译
- Maven 小技巧之 自动更新你的jar包
- Win7 32位下安装centos i386 虚拟系统
- 多线程、socket、全局静态变量、聊天室
- 99乘法表脚本
- ACM-BFS之Nightmare——hdu1072