各种蹂躏——基础dp

来源:互联网 发布:java接口管理系统 编辑:程序博客网 时间:2024/05/14 17:39

(1) LIS:  很久之前就学过nlogn的LIS,不过早就忘了,今天一考,甚至没想到这就是LIS,然后各种蹂躏;

维护一个队列:v[];v[i]表示长度为i的采摘顺序的最后一个采摘的西瓜的最小值,这样可以保证v数组是单调递减的。这样在每次查询中都可以根据单调性二分。就将复杂度将为nlogn。

(2) LCS: 又是很久之前学过的,不过当时就没怎么搞清楚,现在明白了,就是用一个矩阵求两个字符串的匹配情况,然后求最长的对角线。空间复杂度O(n*n) 时间复杂度O(n*n),主要是优化空间,滚动数组。

f[i][j]=f[i-1][j-1]+1;a[i]==b[j]

f[i][j]=max(f[i][j-1],f[i-1][j]);a[i]!=b[j]

优化后:

f[i][size]=f[i-1][1-size]+1;a[i]==b[j]

f[i][size]=max(f[i-1][size],f[i][1-size])a[i]!=b[j]

(3)最大M子段和:f[i][j]=max(f[i-1][j-1],f[i-1][t])+a[j],  j<=t<=i;但因为空间要爆,所以要优化空间:

滚动数组 f[i]=max(f[i-1],best[1-size][i-1])+a[j];best[i][size]=max(best[i-1][1-size],f[i]);

原创粉丝点击