DP---(POJ1159 POJ1458 POJ1141)】的更多相关文章

POJ1159,动态规划经典题目,很适合初学者入门练手. 求:为了使字符串左右对称,应该插入的最小字符数目. 设字符串为S1 S2 S3 - Sn. 这个字符串有n个字符,根据DP的基本思路,减少问题规模.如果S1和Sn匹配,则只关心S2 S3 -Sn-1,就这样问题规模减少了.如果S1和Sn不匹配,那就有两种办法. 方法1:加入S1',字符串成S1S2 S3 - Sn S1',则问题转化为S2 S3 - Sn. 方法2:加入Sn',字符串成Sn'S1S2 S3 - Sn,则问题转化为S1 S3…
poj1000,poj1003,poj1004,poj1064,poj1218 水题 poj1012:0<k<14——漂亮的打表 poj1651:与能量项链很像的dp poj1159:回文词,正反序求LCS,然后再用原长减一下即可 poj3264:一看就知道的RMQ,ST,线段树均可 poj1092:拓扑排序 poj2299:最少相邻交换次数——其实是逆序对的个数,mergersort即可 poj1002:快排,注意细节即可(补0) poj2377:最大生成树,克鲁斯卡尔+并查集即可 poj1…
题目大意:给出一个字符串,问至少添加多少个字符才能使它成为回文串? 思路:很明显的方程是:dp[i][j]=min{dp[i+1][j],dp[i][j-1],dp[i+1][j-1](str[i]==str[j]时)} dp[i][j]表示第i个字符到第j个字符构造成回文串最少添加的字符,但discuss里说了 这样做会超空间+超时 观察下这个方程,每次用到的就是那三个子状态,于是适当的改变方程的形式: dp[i][j]表示第i个字符开始长度为j的子串构成的字符串最少需要添加的字符,于是方程变…
//Accepted 176 KB 47 ms //感谢大神们为我们这群渣渣铺平前进的道路!! //用scanf("%s",s)!=EOF WA到死 #include <cstdio> #include <cstring> #include <iostream> using namespace std; ; ; char s[imax_n]; int dp[imax_n][imax_n]; int n; int min(int a,int b) {…
//Accepted 204 KB 891 ms //dp最长公共子串 //dp[i][j]=max(dp[i-1][j],dp[i][j-1]) //dp[i][j]=max(dp[i][j],dp[i-1][j-1]+1) (s1[i]==s2[j]) #include <cstdio> #include <cstring> #include <iostream> using namespace std; ; ][imax_n]; char s1[imax_n];…
本文出自:http://blog.csdn.net/svitter 原题:http://poj.org/problem?id=1141 题意:输出添加括号最少,并且使其匹配的串. 题解: dp [ i ] [ j ] 表示添加括号的个数, pos[ i][ j ] 表示 i , j 中哪个位置分开,使得两部分分别匹配. pos [ i ][ j ] 为-1的时候,说明i, j 括号匹配. 初始值置dp [ i ] [ i ]  = 1; 如果只有一个括号,那么匹配结果必然是差1. 首先判断括号是…
题目链接:http://poj.org/problem?id=1159 题意:求一个字符串加多少个字符,可以变成一个回文串.把这个字符串倒过来存一遍,求这两个字符串的lcs,用原长减去lcs就行.这题卡内存真稀奇,于是修改成滚动数组.观察发现i值的更新只有可能是从i或i-1转移来,所以就i取模2. /* ━━━━━┒ギリギリ♂ eye! ┓┏┓┏┓┃キリキリ♂ mind! ┛┗┛┗┛┃\○/ ┓┏┓┏┓┃ / ┛┗┛┗┛┃ノ) ┓┏┓┏┓┃ ┛┗┛┗┛┃ ┓┏┓┏┓┃ ┛┗┛┗┛┃ ┓┏┓┏┓┃…
题目大意 给定一个字符串S,问最少插入多少个字符可以使字符串S变为回文串 题解 用dp[i][j]表示把字符串s[i-j]变为回文串需要插入的最小字符数 如果s[i]==s[j]那么dp[i][j]=dp[i+1][j-1] 如果s[i]!=s[j]那么dp[i][j]=min(dp[i+1][j],dp[i][j-1])+1 可以用滚动数组优化一下空间 代码: #include<cstdio> #include<algorithm> #include<cstring>…
题目链接. 分析: 感叹算法的力量. 方法一: 设 dp[i][j] 为字符串 s, 从 i 到 j 需要添加的最少字符数. 那么如果 s[i] == s[j], dp[i][j] = dp[i+1][j-1]. 如果 s[i] != s[j], dp[i][j] = min(dp[i+1][j], dp[i][j-1]) + 1. #include <iostream> #include <cstdio> #include <cstdlib> #include <…
Palindrome Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 58277   Accepted: 20221 Description A palindrome is a symmetrical string, that is, a string read identically from left to right as well as from right to left. You are to write a…