第十四周总结

这周学习了动态规划,虽然动态规划第一次学,但相较于上一周看了挺多题,但是能看懂的不多,很多可以说是根本就看不懂,那我就总结一下这周看懂的题吧!

1、最小正子段和

题意:N个整数组成的序列a[1],a[2],a[3],…,a[n],从中选出一个子序列(a[i],a[i+1],…a[j]),使这个子序列的和>0,并且这个和是所有和>0的子序列中最小的。
例如:4,-1,5,-2,-1,2,6,-2,-1,5,-2,-1,序列和为1,是最小的。

思路:这是我看的第一道题,这道题虽然没用到动态规划中的dp,但这个思路我感觉很好,是我入门动态规划的第一步,现在想一想,用动态规划,好像要简单点。当时解:先是计算了从第一位到每个位置的数字的和,用结构体存储和和序号,然后对和进行排序,则只需要用一个循环语句,来判断即可,但是当时我一直没看懂这个值都升序排列了,为啥还要判断大小,运行输出的时候出现了问题,最小值可以等于零,我才意识到这个问题,最小值要大于零才可。

if(a[i].val > a[i-1].val && a[i].pos > a[i-1].pos)  
        {  
            ans = min(ans, a[i].val - a[i-1].val);  
        }  

2、最大连续子序列和

题意:给定K个整数的序列{ A1, A2, …, Ak },其任意连续子序列可表示为{ Ai, Ai+1, …, Aj },其中 1 <= i <= j <= K。最大连续子序列是所有连续子序列中元素和最大的一个。

思路:用第一道的解题思路照样是可以解的,但是现在我在学动态规划,所以我就正式开始进去学习动态规划了,大体思路就是首先设置一个dp[],令dp[i]表示以A[i]作为末尾的连续序列的最大和。于是,通过设置这么一个数组,最大连续子序列和便是数组dp中的最大值,我当时感觉确实很好,由线到点的转化。要求状态转移方程会出现两种情况(1)、最大和的连续序列只有一个元素,即A[i]本身,也就是说dp[i]=A[i];(2)、最大和的连续序列有多个元素,即从前面某个A[j]开始,一直到A[i]结束,也就是dp[i] = A[j]+...+A[i-1]+A[i]。如何获得 A[j]+...+A[i-1]呢?不难发现dp[i-1] =  A[j]+...+A[i-1]。则即可求出状态转移方程dp[i]=max(A[i],dp[i-1]+A[i])。

3、最大子矩阵和

题意:一个M*N的矩阵,找到此矩阵的一个子矩阵,并且这个子矩阵的元素的和是最大的,输出这个最大的值。

思路:就是把二维的变为一维的,那如何实现转换呢?实行的是压缩的方式,很容易想到最后子矩阵一定是在某两列之间的。需要二重循环把他压缩,然后压缩后的成为一串数字了,就可以用下面这样写,这样写简单点,我认为这个if(cur < 0) cur = 0;是求最大连续子序列最关键的,这个保证了不会出现小于当下数的连续子段和。

for(int k = 1; k <= n; k++)  
            {  
                sum[k] = i == j ? a[k][j] : sum[k]+a[k][j];  
                cur += sum[k];  
                if(cur < 0) cur = 0;  
                ans = max(ans, cur);  
            }  

4、最长不下降子序列

题意:在一个数字序列中,找到一个最长的子序列(可以不连续),使得这个子序列是不下降(非递减)的。

思路:设置两层循环,第一层用来按顺序计算出dp[i]的值,接着就是边界的初始条件设置,即先假设每个元素自成一个子序列,求状态转移方程,用来更新dp[i],要满足当前值大于前面的值,并且前面的值dp[j]+1要大于当前的dp,才可以更新的dp[i]=dp[j]+1。

总结一下:有一道最长公共子序列,还有一个点没看懂,一直也没想明白,别的最长回文子串和最长路也看了,但是都没看懂,也就刚了解大体的意思,这个星期学的都是一些简单的知识,对于动态规划仅仅做到了刚入门的水平,以后有时间的话还会接着学下去,这周就这样过去了,下一周的背包好好看,争取可以多学点东西。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值