ACM总结

第十五次

这个周我们学习的主要内容就是DP,即动态规划。这个内容老师之前给我们打过预防针,这部分内容不简单。但是学前面的内容涉及到了动态规划,写总结的时候就有点偏向于动态规划。然后老师就劝我们这一部分的内容不简单。确实,现在看来真的好多不是很好写。

当时看的动态规划,其实感觉挺简单的,感觉好多都是用的递归或者递推。因为我当时看的关于动态规划的内容都是很浅的,那一些题目的状态转移方程很好找。但是现在学的内容是真的不简单,一眼都看不出来传递的方程。有的题目想好久也想不到解题的方法。。。思维大考验。

动态规划是按阶段分成子问题,找出子问题的最优值,然后就能得到总问题的最优解。这个与贪心最大的区别就是有后效性。而贪心没有,贪心算法也不从整体上考虑,只要当前状态的最优解。动态规划更多的是从底往上,而贪心更多的是从顶往下。

动态规划的代码长度不是很长,但是想思路就有点难了。好多题目都是想出状态转移方程。然后有的题目是从前往后推,而有的就是从后往前了。

动态规划需要建立数组来储存之前已经算出来的结果,然后再接下来就需要用到数组里面的内容来简化运算。注意数组的下标所代表的含义

我这个星期主要看的内容就是老师发的博客,里面有好多篇博客,我主要看了前几个人的博客。每一个题目都需要花好久去想思路。而且好多题目都是自己想不出来思路的,需要看下面的题解,然后有时候题解都需要看好久。

下面就上一个模板吧,这个模板挺基础的,可以作为许多题目的基础来加入进去。

这个题是找一个数列的最大连续子段和,如果最大的小于0,那么直接就是0。

在这个代码中有俩个关键的数组,一个是用来储存原来的数列的数组a[n]。还有一个就是以i作为子段最后一个元素的dp[i]。

int maxSubSum = 0;//maxSubsum就是和,用来计数的一个变量
dp[1] = Max(a[1], 0);//状态转移方程的一种一个
int i;
for (i = 2; i <= N; ++i)
    dp[i] = Max(dp[i - 1] + a[i], 0);//另一个状态转移方程
for (i = 1; i <= N; ++i) {
    if (maxSubSum < dp[i])//最后找出最大值
        maxSubSum = dp[i];
}

找出每一个元素作为结尾的的最大的子段和,用dp[i]储存起来,然后就可以递归到后面的元素来运用。(这个思路自己想的话,应该是想不出来的,这个是老师上课的时候讲的例题)。然后再看博客的过程中,又会有许多求和的题目可以借用这个模版。比如二维上求和,就可以先选定哪几列,然后将这几列对应元素求和,就可以化为一维的来求解。三维的应该也行。

因为这一专题的题目几乎都需要找出状态转移方程,我就不在这枚举更多的题目了。

我能明显感觉到我这周看博客的时间有点少。完全看懂的博客题目便更少。可能是因为这个星期的其他事太多了。而且自己的学习效率也不是很高。

我自身有毛病就是看到难题而且当时不想动脑的时候我就走神,然后还有就是没有规划,就算是有了学习规划,我也很难按这个规划走下去,没有办法坚持下去。所以规划在我这的用处就不是很大。但是我也知道做规划的好处,可以提高学习的效率,然后完成规划的内容后,也可以毫无负罪感的玩。马上就要来临期末考试了,我要做一个有规划,并按规划执行的孩子。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值