随笔分类 - 动态规划--线性dp
摘要:题目链接推了半个下午。。写的三重超时了 加了点单调队列的思想 优化了下过了dp[i][j] 第二组的最右边的人选第J个人 那最左边肯定选第j-1个人 肯定是选相邻的dp[i][j] = min(o,dp[i-1][j-2]+(h[j]-h[j-1])*(h[j]-h[j-1])) 加个变量o保存 到j为止 最优的一个位置 j-2得满足条件 1 #include 2 #include 3 #include 4 #include 5 #define N 5010 6 #define M 3010 7 #define INF 0xfffffff 8 using namespace std; 9 i.
阅读全文
摘要:http://poj.org/problem?id=1191黑书上P116 想了挺久 没想出来 想推出一公式来着 退不出来。。想偏了 正解:递归 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define INF 0xfffffff 9 #define LL long long10 int dp[20][10][10][10][10];11 int aa[10][10],n;12 int divide(int k,int a,int b,int c,int.
阅读全文
摘要:http://poj.org/problem?id=1160算水过的吧 四重循环没优化 CZ说爆可过 就爆了dp[i][j] = min(dp[i][j],dp[i-1][g]-s) 第i个点建在第j个村庄上 s 是这个点比上个点少的距离 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define N 1010 9 #define INF 0xfffffff10 int h[N],dp[40][N];11 int main()12 {13 int ...
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4681枚举A串和B串包含C串的区间 枚举区间端点算左右两端最长公共子序 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 1010 8 char s1[N],s2[N],s3[N]; 9 int dp1[N][N],dp2[N][N];10 struct node11 {12 int l,r;13 }p1[N],p2[N];14 int main()15 {16 ...
阅读全文
摘要:http://poj.org/problem?id=3368追完韩剧 想起这题来了 想用线段树搞定来着 结果没想出来。。然后想RMQ 想出来了算是离散吧 把每个数出现的次数以及开始的位置及结束的位置记录下来 以次数进行RMQ 再特殊处理下区间端点就OK 了WA一次 盯了半小时 原来少了个=号 好吧好吧。。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define N 200005 9 struct node10 {11 int s,e,a;12 ...
阅读全文
摘要:http://poj.org/problem?id=3264RMQ讲解http://dongxicheng.org/structure/lca-rmq/j = log2Kdp[i][j] = max(dp[i][j-1]+dp[i+(1 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define N 50005 9 int minz[N][40],maxz[N][40];10 void init(int n)11 {12 int i,j,o = floor(log10(d...
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4669这题各种错误都来了一遍 预处理一下第一个数作为尾数与相邻前面的数组成的数的余数 然后再与后面的结合求余数9 6 4 2 8 因为是个环 可以 9 6 4 2 8 9 6 4 2 8 组合 不过 又不能超N所以先预处理 89 289 4289 64289 的余数 再与后面的组合 删除重复的 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #define N 50005 7 #define LL __int64 8 .
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4632TLE了N次 原因居然是取模次数太多了。。! 这数据卡的好紧 还是我写的太搓。。828ms挤过s[i]==s[j]dp[i][j] = dp[i][j-1]+dp[i+1][j]+1;else dp[i][j] = dp[i][j-1]+d[[i+1][j]-dp[i+1][j-1]; 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #define mod 10007 7 char s[1010]; 8 int .
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4526额。。七夕快乐哦刚推的时候有点乱 又各种小错误 查了好久。。dp[i][k] = min(dp[i-1][g]+g*t+d,dp[i][k]){(g-k) 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define INF 0xfffffff 8 int ca[111][2],dp[110][110]; 9 int main()10 {11 int t,g,i,j,k,n,s,d;12 cin>...
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4323去年的多校 编辑距离的变形 暴力居然过了 还想了好久别的方法,想得很头疼 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 int dp[12][12],kk[1510],num[1010]; 8 char s[1510][12],ss[12]; 9 int main()10 {11 int i,j,k,n,m,t,a,b,o=0,g;12 scanf("%d",&t
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4374去年多校的题 今年才做 不知道这一年都干嘛去了。。DP的思路很好想 dp[i][j] = max(dp[i-1][g]+sum[i][j]-sum[i][g-1],dp[i][j]) abs(g-j) 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 105 8 #define M 10005 9 #define LL __int6410 int a[N][M],que[M];11 int dp[
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1838其实原先不知道这题是DP 我都想不到DP去想了想没思路 看了下题解 经典思路 :第n大的都是由第n-1大的推出来的记录以a(i,j)为右下端所能构成的最大棋盘 若a[i-1][j]和a[i][j-1]都与它不同 而且a[i-1][j-1]与它相同 则dp[i][j] = min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1 之所以是最小 是因为它要保证能全部构成 如:1011010110100101dp[4][4] 如果可以由dp[3][3]推的话 就错了 应该是由dp[3
阅读全文
摘要:http://poj.org/problem?id=1088据说这题叫经典记忆化搜索 瞎写了下就过了 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define INF 0xfffffff 8 int a[110][110],dp[110][110]; 9 int find(int i,int j)10 {11 if(dp[i][j])12 return dp[i][j];13 int x=0,y=0,z=0,o=0;14 if(a[i][j]>...
阅读全文
摘要:http://poj.org/problem?id=2229挺好的一公式。。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 1000010 8 #define mod 1000000000 9 long long dp[N];10 int a[N];11 int main()12 {13 int i,j,k,n;14 while(cin>>n)15 {16 memset(dp,0,sizeof(dp));17 ...
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4293这题单拉出来写篇吧 确实不错的一题将每个人说的话 转化一下 可以算出它处在哪个段中 题目就转换成了求不相交的最大段数 注意区间相同的情况 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 struct node 8 { 9 int l,r;10 }p[510];11 int dp[510],w[510][510];12 bool cmp(node a,node b)13 {14 ...
阅读全文
摘要:补补弱项 全面发展。。从最基础来sdut1299最长上升子序 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 int dp[1100]; 8 int a[1100]; 9 int main()10 {11 int i,j,k,n;12 cin>>n;13 for(i =1; i >a[i];16 dp[i] = 1;17 }18 for(i = 1; i a[j])21 {22 dp[i] = max(...
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1501搜了下记忆化搜索是嘛 然后就看到这个题了 不过一不小心看到代码了 代码又那么短 一不小心给记住了 然后看了题也没怎么想这个题比较简单把 也没看出哪里记忆化了 感觉扫了一遍 因为s是s1和s2的和 所以对于s里面的字符要么是s1里的要么是s2里的 若都有 分两种情况去搜 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 char s1[210],s2[210],s[500]; 8 int a[2.
阅读全文
摘要:对dp很无奈。。枚举所有可能达到的值 dp[i]表示到达i值所用最少的邮票 1 /* 2 ID: shangca2 3 LANG: C++ 4 TASK: stamps 5 */ 6 #include <iostream> 7 #include<cstdio> 8 #include<cstring> 9 #include<stdlib.h>10 #include<algorithm>11 using namespace std;12 int p[55],dp[2000010];13 bool o[2000010];14 int mai
阅读全文
摘要:来打个酱油 3.1是最小生成树模板View Code 1 /* 2 ID: shangca 3 LANG: C++ 4 TASK: inflate 5 */ 6 #include <iostream> 7 #include<cstdio> 8 #include<cstring> 9 #include<algorithm>10 #include<stdlib.h>11 using namespace std;12 int c[10010],w[10010],dp[10010];13 int main()14 {15 freopen(&q
阅读全文
摘要:http://poj.org/problem?id=1836打了一堆 网络连接失败 。。不打了View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<stdlib.h> 5 #include<algorithm> 6 using namespace std; 7 int dp1[1010],dp2[1010],h[1010]; 8 int main() 9 {10 int i,j,k,n;11 double he[1010];12
阅读全文