随笔分类 - 动态规划--线性dp
摘要:链接13年长沙邀请赛的题,神题意~题意:摘自http://blog.csdn.net/libin56842/article/details/9703457这题题意确实有点难懂,起码对于我这个英语渣渣来说是这样,于是去别人的博客看了下题目意思,归纳起来如下:给出一个长度为n的数列,将其分成若干段,要求...
阅读全文
摘要:链接这题第一想法是矩阵,不过范围太大了,然后就没有思路了。。之后看到群里的解法,行和列可以分着走,两者是互不影响的,这样就把二维转换成了一维,直接dp求出就可以了。然后再组合相乘一下。 1 #include 2 #include 3 #include 4 #include 5 #include 6...
阅读全文
摘要:1437记忆化 模拟倒水过程 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include10 using namespace std;11 #define N 25612 #define LL long long13 #define INF 0xfffffff14 const double eps = 1e-8;15 const double pi = acos(-1.0);16 const double inf = ~0u>>2;17 bool
阅读全文
摘要:链接二分时间,在时间内dp[i][j]表示截止到第i个人已经做了j个A最多还能做多少个B#include #include#include#include#include#include#include#include#includeusing namespace std;#define N 200000#define LL long long#define INF 0xfffffffconst double eps = 1e-8;const double pi = acos(-1.0);const double inf = ~0u>>2;int a[55],b[55];int d
阅读全文
摘要:01背包 加上每次更新解题数目最多 总用时最少 因为要保证用时最少,要先把时长由小到大排序。没排序 WA了几小时。。链接 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include10 #include11 using namespace std;12 #define N 101013 #define LL long long14 #define INF 0xfffffff15 const double eps = 1e-8;16 const double.
阅读全文
摘要:ZOJ 3605大体意思就是 找出随机选了K个交换后 石子在第i个罐子里的概率最大也就是可能的总数最大 这样就可以写出递推方程 dp[i][j][k] += dp[i-1][e][k]; (0 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include10 using namespace std;11 #define N 10000012 #define LL long long13 #define INF 0xfffffff14 const double eps = 1e-8;
阅读全文
摘要:A 直接线段树过的 两遍 貌似大多是标记过的。。注意long long 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define LL long long 9 #define N 100100 10 LL s[N>1; 25 build(l,m,w=r) 56 { 57 if(f) 58 { 59 s[w]+=(r-l+1); 60 l...
阅读全文
摘要:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1933矩形的dp一般挺类似 大的矩形都是由小的推出来的 对于一个长为i 宽为j 的 矩形 分别枚举把这n个给出的小矩形放入里面后 取一个最优值dp[i][j] = max(dp[i][j],dp[i-x][j]+dp[x][j-y],dp[i][j-y]+dp[i-x][y]) 交换小矩形的长宽 再取一次 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #i
阅读全文
摘要:Problem Statement Vocaloids Gumi, Ia, and Mayu love singing. They decided to make an album composed of S songs. Each of the S songs must be sung by at least one of the three Vocaloids. It is allowed for some songs to be sung by any two, or even all three Vocaloids at the same time. The number of son
阅读全文
摘要:链接题目大意就相当于 跟你一串字符串 让你截成k段 使总体的值最小想法是递归的 递归太慢 可以转换为递推的这样就有可以推出状态方程 dp[i][j] = max(dp[i][j],dp[i-1][g]+sum[g+1][j]+sum[1][g]-sum[1][j]); dp[i][j]表示总长度为j第i次截的最小值 后面的sum[i][j]表示的就是从i开始作为第一个到j个的花费 o[i][j]保存路径 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #defi.
阅读全文
摘要:1238这算模拟加记忆化吗 找bug找了2个多小时。。记忆化部分好想 就是字符串处理部分挫了 一个个复制模拟 各种修改查找 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define INF 0xfffffff 9 int dp[110][110],o[110][110]; 10 char s[110][110][110],ss[110]; 11 int len(int x) 12 { 13 int q=0; 14 whi...
阅读全文
摘要:1495牵扯一点数位 保存数的时候我是按2进制保存的 把1当作0算 把2当作1算 滚动数组dp[i][j][(g*10+j)%n] = min(dp[i][j][(g*10+j)%n],dp[i-1][1][g]*2+j-1,dp[i-1][2][g]*2+j-1) j取1,2 *2+j-1是因为我按二进制算的时限给出的2S就是给我这种毫无优化又笨又戳的代码的 跑了1.39s0xfffffff的范围 是2Y多 还是少用好了 太容易超了 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using name..
阅读全文
摘要:1513这题好久之前就看过了,悲催的是当时看题解都没看懂,今天又看了看so easy...n个B里不能出现超过连续k个L的情况 一维递推就可以 两种情况 1、dp[i] += dp[i-1] 在i-1的串后面直接加一个B 2、dp[i]+=dp[i-2]+dp[i-3]+...+dp[i-k-1] 这部分的意思是在串后面补连续1个L 2个L 3个L。。K个L的情况 那补一个L的情况要取决于dp[i-1]里面最后一位为B的个数 正好为dp[i-2],依次可做。 1 import java.text.*; 2 import java.io.*; 3 import java.util.*; 4 im
阅读全文
摘要:1900二维dp挺好推 dp[i][j] = max(dp[i][j],dp[g][j-1]+o[i][i+1]-o[g][i+1])(i>g>=j-1) dp[i][j]表示第i个站台开放第j次设备 预处理出来通过i-j的人数 包括 i-1~j+1等等的 用o[i][j]表示的没睡好 %>_ 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 #define LL long long10 int dp[510][510],q[510];11 in
阅读全文
摘要:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2169感觉是有递归思想的 dp[j]表示从1到j分成了i段 最多分成m段 肯定是分的越多越小的 第一重循环为(1,m)dp[j] = min(dp[j],dp[g]+pow(sum[g..j]); 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define N 1010 9 #define INF 0xfff
阅读全文
摘要:1427题意不太好理解 其它没什么 细心啊 细心 一个0写成了1 WA半天以每个字符是以第一种方式还是第二种方式来D 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define N 100010 9 char s[N];10 int dp[N][2],o[N][2];11 int judge(char x)12 {13 if(x==' ')14 return 1;15 if(x>='a'&&x='
阅读全文
摘要:贡献了一列WA。。数学很神奇啊这个题的关键是怎么才能算尾0的个数 只能相乘 可以想一下所有一位数相乘 除0之外,只有2和5相乘才能得到0 当然那些本身带0的多位数 里面肯定含有多少尾0 就含有多少对2和5这样就知道了 就是求2和5 的对数最少的 一条路 DP就不用说了 递推注意有0的时候的计算 特殊处理一下 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define N 1010 9 #define INF 1e10 10 #define...
阅读全文
摘要:只有小写字母 那>=2600的直接找单字母串长度大于等于100的就可以了<2600 的dp找最长回文串 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define N 50010 9 char s[N];10 char pa[2610];11 int dp[2610][2610][2],g,n,o[30];12 void dfs(int ss,int i,int j,int k)13 {14 if(ss==0)15 return ;16 ...
阅读全文
摘要:1287水DP 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define N 1402 9 int dp[N][N][4];10 char s[N][N];11 int main()12 {13 int i,j,n;14 scanf("%d",&n);15 for(i = 0 ; i >s[i];17 dp[0][0][0] = 1;18 dp[0][n-1][3] = 1;19 for(i = 0 ; i...
阅读全文
摘要:1346简单dp 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define N 200010 9 int p[N],dp[N][2];10 int main()11 {12 int i,a,b;13 scanf("%d%d",&a,&b);14 for(i = 1 ; i p[i-1])21 {22 dp[i][0] = min(dp[i-1][1]+1,dp[i-1][0]);23 ...
阅读全文