随笔分类 - dp
摘要:Palindrome 题意:给一个字符串,问最少加上多少个字符,可以使这个字符串成为回文串 思路一、直接dp(会爆内存) dp[i][j]表示区间[i,j]之间有最少需要加上多少个字符 状态转移方程:如果s[i] = s[j], 则dp[i][j] = dp[i + 1][j - 1]; 如果s[i
阅读全文
摘要:一、基本概念 1、链式区间dp for(int len = 2; len <= n; len++){ //枚举区间长度 for(int i = 1; i + len - 1 <= n; i++){//枚举左边界 int j = i + len - 1; //有边界 for(int k = i; k
阅读全文
摘要:1、Cut Ribbon 思路一:数据范围很小,考虑直接枚举。 #include<bits/stdc++.h> #define int long long using namespace std; int n, p, q, r; signed main(){ cin >> n >> p >> q >
阅读全文
摘要:一、状态压缩DP概述 1、概念 状态压缩dp通过将状态转换成整数,来实现状态转移。 前置知识:位运算(&、|、!、^) 当要处理一些集合问题的时候,可以将状态转换为整数,运用二进制相关知识解决问题。 二、例题 1、互不侵犯 分析: 前一行会决定后一行的选择 状态转移方程:$f[i][j][k] +=
阅读全文
摘要:状态转移方程:dp[i] = dp[i - 1] + dp[i - 2]。 当前行,可能是由上一行转移过来的,那么当前行就只能横着铺,所以方案数是dp[i - 1]。 当前行,可能是由i-2行转移过来的, 那么就只有竖着铺俩这种方案(横着铺俩这种方案会与横着铺重复),所以是dp[i - 2]。 仔细
阅读全文