随笔分类 - { 动态规划 }
摘要:给一个字符串,问有几种删字符的方式使删后的非空字符串是个回文串。 当然区间DP:dp[i][j]表示子串stri...strj的方案数 感觉不好转移,可能重复算了。我手算了"AAA"这个数据,然后就搞出转移的方式: d[i][j] = ∑ d[i'][j']+1 (i<=i'<=j'<=j 且 st
阅读全文
摘要:求一个图的哈密顿路径的最大权及其路径数。显然状态压缩+DP。 dp[v][u][S] 表示从v走到当前顶点 u且走过的顶点集合是S的 最大权值和方案数 这题我用记忆化搜索,从终点开始递归进行,感觉这样比较容易转移。 就是搜索一个状态可以从哪些状态转移过来,顺便统计方案数。搜索时要注意一些细节,转移要
阅读全文
摘要:容易想到状态dp[n][S][m](S是数字出现的集合),表示前n位用了数字集S且模k余数是m的方案数。 利用 (xy)base % k = ( x*base+y ) % k = (( x%k ) * base + y) % k ,进行状态第三维的转移。 不过d[16][216][20]有2000多
阅读全文
摘要:容易猜测到包含s1、s2序列的串的最短长度是LCS(s1,s2) + ( len(s1) - LCS(s1,s2) ) + ( len(s2) - LCS(s1,s2) ) ,即: len(s1)+len(s2)-LCS(s1,s2) 接下来求方案数,可以想到: dp[k][i][j]表示由s1前i
阅读全文
摘要:单整点集V是无向无环图,可以看作树。 dp[u]表示,选取u点时u点和它子树最大的权和。 而某个点不选,那么它和它子树的最大权和是0,因为题目求的集合要连通。 状态转移方程是:dp[u]=∑max(0,dp[son(u)])。 1 #include<cstdio> 2 #include<cstdli
阅读全文
摘要:首先,定义S,表示前k个字符出现的集合,用二进制来压缩。 接下来,推出dp1[S],表示集合为S的子串的最长长度。 然后根据dp1[S]再推出dp2[S],表示集合为S或S的子集的子串的最长长度。 最后答案就是max(dp2[S]*dp2[补(S)]) 1 #include<cstdio> 2 #i
阅读全文
摘要:dp[u][t]表示从起点出发,到达i点且用了t次magic boot时的最短时间, 方程如下: dp[v][t]=min(dp[v][t],dp[u][t]+dis[u][v]); dp[v][t]=min(dp[v][t],dp[u][t-1]) (dis[u][v]<=l) 放进SPFA更新,
阅读全文