neu dp b题 hdu1087
来源:互联网 发布:前苏联校服 知乎 编辑:程序博客网 时间:2024/05/17 07:29
第一次写题解,希望能从中学习
题意:
给一列数,求其上升子序列中,所有数之和最大的;
答案只要这个和就可以了;
思考轨迹,
拿到这个题首先想到以前做过的最长上升子序列和最大连续子序列和这两道题;
对于问题子结构的刻画:
和是多少? //这是要得到最优的解
原数列有哪些?
数列的最后一个数是多少?//用于判断是否满足从子问题到原问题 转化的条件,能否进行转移;
sum(i)
以第 i 个数作为数列的最后一个数从前 i 个数中所得数列其最大和;
这样同时刻画下来了必备的子问题解空间的信息 //亦或是上一个状态的信息
子问题与原问题的关系
//状态转移方程
sum(i) = max( sum(k) + a[i] ) k : [0,i-1]
随便写一组数:
2 3 2 4 5
可见问题 为 求 sum(1)到 sum(5) 中最大的。
画子问题图 用于判断问题解答顺序的依赖关系
s[5]
s[0] +a[5] , s[1]+a[5], s[2] +a[5] ,s[3]+a[5],s[4]+ a[5]
s[1]
s[0] + a[1];
s[2]
s[0] +a[2],s[1]+a[2]
s[3]
s[0]+a[3] ,s[1] +a[3],s[2] +a[3]
…
可以看出子问题的解决是以
S1 S2 S3 S4。。。SN这样的顺序。
每个子问题的解决均可能调用其 序数小于他的解 并从 找到转移产生最大的
可写出自底向上的代码
for(int i = 1;i <=N;i++){//从sum(1) 到 sum(n) int max = 0; for(int j = 0;j <= i-1;j++) //从前 i-1 个子问题找 if(a[i] > a[j] || j == 0 )//判断是否能进行转化 max = max > s[j] + a[i] ? max : s[j] +a[i]; s[i] = max;//取最大并更新 whole_max = whole_max > max ? whole_max : max;}//for
从而解决问题
0 0
- neu dp b题 hdu1087
- HDU1087(DP)
- NEU 1576 (DP)
- 单行dp复习hdu1087
- hdu1087 DP水题
- hdu1087(DP)
- NEU 1007 (字典树 DP)
- hdu1087
- hdu1087
- HDU1087
- HDU1087
- hdu1087
- hdu1087
- hdu1087
- hdu1087
- hdu1087
- HDU1087
- hdu1087
- PHP抓取网页内容获得网页源代码
- 分布式缓存技术redis学习系列(五)——spring-data-redis与JedisPool的区别、使用ShardedJedisPool与spring集成的实现及一致性哈希分析
- TPL——Task的状态及堕性Task
- How many integers can you find
- Learning Spark 笔记(四) -- reduceByKey、combineByKey
- neu dp b题 hdu1087
- 模态对话框DoModal() 造成 软件/ 菜单 卡死或死机
- Android自定义组件EditText,带清空输入内容图标
- swift 发送udp指令相关
- 游戏整理1
- MAC安装APACHE ANT
- 注解@PostConstruct与@PreDestroy讲解及实例
- Redis事务介绍
- 【数据挖掘】关联规则分析——以1984年美国国会投票记录为例