caioj 1068是最长公共子序列裸体,秒过, 就不写博客了

caioj 1069到1071 都是最长公共字序列的拓展,我总结出了一个模型,屡试不爽

   (1) 字符串下标从1开始,因为0用来表示字符为空的情况,而不是第一个字符 

   (2)初始化问题。
         一般设f[i][j]为第一个字符前i个,第二个字符前j个的最优价值

         f[0][0] = 0

          然后要初始化f[i][0], f[0][i]


      这个时候要根据题意。

         这个时候就是一个字符有,一个字符空的情况

   (3)然后就可以两层for了
          这个时候记住根据题目有不同的决策,取最优

          一般有匹配字符和不匹配字符(如加空格)两种情况


          按照题目而定  

          最后要注意如果是取min初值要最大,max初值最小

          或者直接用其中一个决策作为初值

这道题要右对齐,所以直接逆序存

    

然后套模型

初始化的话,显然空的时候全部都是空格

所以都初始化为-1

决策的话

如果是匹配字符的话,一样就加2,否则不加

如果是空格的话,就两边枚举空格长度取最优

具体看代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std; const int MAXN = 60;
char a[MAXN], b[MAXN], s[MAXN];
int f[MAXN][MAXN]; void up(int &x, int a) { x = max(x, a); } int main()
{
scanf("%s", s + 1);
int lena = strlen(s + 1);
REP(i, 1, lena + 1) a[i] = s[lena-i+1]; scanf("%s", s + 1);
int lenb = strlen(s + 1);
REP(i, 1, lenb + 1) b[i] = s[lenb-i+1]; REP(i, 1, lena + 1) f[i][0] = -1;
REP(i, 1, lenb + 1) f[0][i] = -1;
f[0][0] = 0; int ans = -1e9;
REP(i, 1, lena + 1)
REP(j, 1, lenb + 1)
{
f[i][j] = -1e9;
if(a[i] == b[j]) up(f[i][j], f[i-1][j-1] + 2); //选择匹配字符
else up(f[i][j], f[i-1][j-1]); for(int k = i - 1; k >= 0; k--) up(f[i][j], f[k][j] - 1); //选择空格
for(int k = j - 1; k >= 0; k--) up(f[i][j], f[i][k] - 1); up(ans, f[i][j]);
}
printf("%d\n", ans); return 0;
}

caioj 1069 动态规划入门(二维一边推2:顺序对齐)(最长公共子序列拓展总结)的更多相关文章

  1. caioj 1071 动态规划入门(二维一边推4:相似基因) (最长公共子序列拓展)

    复制上一题总结 caioj 1069到1071 都是最长公共字序列的拓展,我总结出了一个模型,屡试不爽    (1) 字符串下标从1开始,因为0用来表示字符为空的情况,而不是第一个字符     (2) ...

  2. caioj 1070 动态规划入门(二维一边推3:字符距离)(最长公共子序列拓展)

    复制上一题总结 caioj 1069到1071 都是最长公共字序列的拓展,我总结出了一个模型,屡试不爽    (1) 字符串下标从1开始,因为0用来表示字符为空的情况,而不是第一个字符     (2) ...

  3. caioj 1073 动态规划入门(三维一边推:最长公共子序列加强版(三串LCS))

    三维的与二维大同小异,看代码. #include<cstdio> #include<cstring> #include<algorithm> #define REP ...

  4. caioj 1063 动态规划入门(一维一边推1:美元和马克)

    这道题一开始我是这么想的 最后的答案肯定是某次的马克换回来的,但这个该怎么确定?? 实际上应该把范围缩小,只看最后一次和倒数第二次之间有什么联系. 可以发现,只有两种可能,最后一天换或者不换.换的话就 ...

  5. caioj 1067动态规划入门(一维一边推5: 乘积最大(高精度版))

    因为这里涉及到乘号的个数,那么我们可以用f[i][j]表示前i个位乘号为j个时的最大乘积 那么相比上一题就是多了一层枚举多少个乘号的循环,可以得出 f[i][r] = max(f[j - 1][r - ...

  6. caioj 1066 动态规划入门(一维一边推4:护卫队)(分组型dp总结)

    很容易想到f[i]为前i项的最优价值,但是我一直在纠结如果重量满了该怎么办. 正解有点枚举的味道. 就是枚举当前这辆车与这辆车以前的组合一组,在能组的里面取最优的. 然后要记得初始化,因为有min,所 ...

  7. caioj 1065 动态规划入门(一维一边推3:合唱队形)

    就是最长上升子序列,但是要用n^2的算法. #include<cstdio> #include<algorithm> #define REP(i, a, b) for(int ...

  8. C++动态规划实现查找最长公共子序列

    问题描述: 给定两个序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},找出X和Y的最长公共子序列.(给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共 ...

  9. 动态规划小结 - 二维动态规划 - 时间复杂度 O(n*n)的棋盘型,题 [LeetCode] Minimum Path Sum,Unique Paths II,Edit Distance

    引言 二维动态规划中最常见的是棋盘型二维动态规划. 即 func(i, j) 往往只和 func(i-1, j-1), func(i-1, j) 以及 func(i, j-1) 有关 这种情况下,时间 ...

随机推荐

  1. Oracle查询当前用户下的所有表及sqlplus 设置 列宽

    如果oracle服务器中装有多个数据库实例,则在用户名处输入:用户名/密码@数据库名称.如果数据库服务器不在本机上,还需要加上数据库服务器的地址:用户名/密码@IP地址/数据库名称. [oracle@ ...

  2. MyBatis中抽象方法中多个参数的问题

    在使用MyBatis时,接口中的抽象方法只允许有1个参数,如果有多个参数,例如:      Integer updatePassword(             Integer id, String ...

  3. vue实现tab栏切换

    html <ul class="tab"> <li v-for="(item,index) in tabs" @click="tab ...

  4. CF474F Ant colony

    #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #i ...

  5. bootstrap 因跳页黑色背景无法关闭

    只需要在跳页之前加上如下代码: $(".modal-backdrop").remove();

  6. 管理windows自启动程序

    1. 点击开始,在运行程序框中输入msconfig,然后回车. 在弹出的对话框中,点击”启动“选项卡,在启动项目列表中,把不需要的启动项目前面的对号去掉. 然后切换到”服务“选项卡,这里的服务项目列表 ...

  7. [Java] 使用 Apache的 Commons-net库 实现FTP操作

    因为最近工作中需要用到FTP操作,而手上又没有现成的FTP代码.就去网上找了一下,发现大家都使用Apache的 Commons-net库中的FTPClient. 但是,感觉用起来不太方便.又在网上找到 ...

  8. sublime搜索和替换--多文件搜索替换

    Search and Replace - Multiple Files Searching To open the search panel for files, press Ctrl + Shift ...

  9. ,典型递归问题-F(1025)mod 5 的值

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...

  10. Google浏览器怎样删除指定网址的网址提示

    方法例如以下: Windows系统:按键盘上的"箭头下".按shift+delete(或者shift+回退): Mac系统:按fn+shift+delete. (此方法不须要清空b ...