菜鸡的第一个DP

来源:互联网 发布:谭浩强c语言第三版ppt 编辑:程序博客网 时间:2024/05/18 03:49

身为一个有志气的大学僧,我决定把我的专业学到精通,So,我参加了ACM,第一周和第二周,老师讲的是DP的入门,为了巩固知识,我将以博客的形式将我的知识记录下来。

第一个,数塔

数塔呢,是最经典的动态规划题目,从底层向顶层搜索一遍即可,令 i = n-2;从下至上搜索一遍即可。

它的核心代码为a [ i ][ j ] + = ( a [ i+1 ] [ j ] > a [ i+1 ] [ j+1 ]? a [ i+1 ] [ j ] : a [ i+1 ] [ j+1 ] );留下我的代码避免遗忘。

第二个呢,就是最长连续子序列的问题了。这个问题到现在我还是没有太清楚,看了几个小时后,代码记住了,先把我现在的思想记录下来,这个程序实现的是将当前的arr[ i ]

同第 i 个之前的数一一比较,如果没有比arr [ i ]小的 dp [ j ], 那么dp [ i ]=1,很明显的事情出现了,显然的,dp [ 1 ]=1,如果有比arr [ i ] 小的arr [ j ],那么如果有一个, 那么 dp [ i ]就加一,对dp[ i ]+1的操作由ans实现。

再过一些时日,彻底明白后,再重写一遍。

最长连续子序列的核心代码为 i f ( arr [ i ] > arr[ j ] && dp[ j ] > ans ) ans = dp[ j ] ; 用两个循环,i,j 分别为外层和内层循环的循环变量, 内层循环后再加上一句 dp[ i ]=ans + 1;

同样,附上代码。

时隔数日,我又看了看这个最长子序列,又有了新的认识,上面的ans是没什么卵用的,其实用dp[ i ]它本身是完全可以的,

经过数天的努力,模模糊糊的懂了裸01背包,我是在杭电上看到了十分简短的代码,于是我便用了最笨的方法,手写循环,看看它究竟发生了什么变化,经过努力,I see.

这个方法呢,是以第几件物品为变量,通过不断地比较来更新最佳方案,就是更新F[va]的值;核心呢是一个公式,即max(F[ j ],F[ j-v[ i ] ] + w[ i ]), i 呢,是第 i 个物品, 

V[ i ]是第i个物品的体积,W[ i ]是它的价值;附有代码如下



接下来呢,我要学习一下打表法,理解后,撰写到此处。







0 0
原创粉丝点击