上一页 1 2 3 4 5 6 7 8 9 ··· 17 下一页
摘要: 状态压缩DP,f[j][i]表示前i行棋子放置状态状态为j的方法数就0<=j<=1<<n,比如j=01010000,表示前i行第5列和第7列放置了棋子的方法总数,具体的递推过程代码如下#include <iostream> #include <cstdio> #include <cstring> using namespace std; int n,k; int num[10],f[1<<8][10],vis[10][10],pa[1<<8]; int main() { while(~scanf("% 阅读全文
posted @ 2013-04-16 14:01 LJ_COME!!!!! 阅读(127) 评论(0) 推荐(0)
摘要: 数位DP。假设长度为s的数字,如果是题目中要求的数字时,肯定是每个位置i ,j,1--i非递减,j--s非递增,然后枚举每个点把左右两方相乘,但是想了想,这么简单的统计会造成很多重复,然后再分析,对于i,j无非三种情况i所在位置数字a>j所在位置数字b,a==b,a<b,先算1--s中的每个位置第一种情况的个数的和,然后发现a==b,a<b的所有情况都可化为第一种情况,所以就不用再求这两种情况的数目,因为第一种情况的所有满足题意的数字已经包括了后两种情况满足意一的数字,所以定义状态f[i][j]表示以数字j结尾的长度为i的非递减数字的个数,还有自己感觉数位DP最坑的地方就是细 阅读全文
posted @ 2013-04-10 14:13 LJ_COME!!!!! 阅读(144) 评论(0) 推荐(0)
摘要: KMP简单应用,利用next,一个一个确定是否和后缀匹配#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxn=400000+10; char s[maxn]; int next[maxn]; int amount[maxn]; int main() { while(~scanf("%s",s)) { int len=strlen(s); int i=0,j=-1; next[0]=-1; ... 阅读全文
posted @ 2013-04-08 21:04 LJ_COME!!!!! 阅读(110) 评论(0) 推荐(0)
摘要: 数位DP,各种理解难题#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #define LL long long using namespace std; unsigned long long n; LL f1[25],f2[25],f3[25]; int s[25]; int t; int main() { cin>>t; int i,j,k; f1[0]=0;f2[0]=1;f3[0]=0; for(i=1;i<=19;i++) 阅读全文
posted @ 2013-04-08 13:54 LJ_COME!!!!! 阅读(111) 评论(0) 推荐(0)
摘要: 单调队列优化DP//状态转移方程:f[i][j]=min(f[i-k][j-1]+(s[i]-s[i-p])*g[j]) #include <iostream> #include <cstdio> #include <cstring> #define LL long long using namespace std; const LL inf=0x3f3f3f3f3f3f3f3f; LL x[10000+10],s[10000+10],q[10000+10]; LL g[200+10]; LL f[2][10000+10]; int n,k,a,b; int 阅读全文
posted @ 2013-04-06 13:24 LJ_COME!!!!! 阅读(180) 评论(0) 推荐(0)
摘要: 还是思维不够灵活,刚开始,只想到了那个O(n3)的算法,知道肯定不行,苦苦思索,实在想不出来,浏览了一下其他人的博客,刚扫一眼,突然想到了还是从最优解的最后的状态考虑,得到了O(n2)的算法,就是对于节点i,枚举,在他左边的与他举例小于l3的点,得到状态转移方程f[i]=min(f[j]+cost),ac之,然后看了浩神的博客,还可以用二分优化,想了想,确实可以,因为点到s起点的举例是单调非减的,对于同一段的肯定最左边的最优,二分得之#include <iostream> #include <cstdio> #define LL __int64 #define min( 阅读全文
posted @ 2013-03-31 18:43 LJ_COME!!!!! 阅读(187) 评论(0) 推荐(0)
摘要: dp+线段树,dp是核心,线段树用来优化复杂度,dp过程好像,但是要确定从一个fence边缘向下沿直线走,下一个fence是哪个,最朴素的想法就是从上到下扫描,时间为O(n2),数据量比较大,可能会超时。然后用线段树来优化这个过程,当输入第i个fence的左右点时,1~i-1的fence所覆盖区间已插入到了线段树中(并在所覆盖的区间发记录fence编号)那么此时,求fence(i)的左点l向下会走到哪个fence,可以从线段树的根开始搜索,搜索到l的这条路径上的最大编号,也就是覆盖了点l的区间上的最大编号,从而得到所求编号#include <iostream> #include & 阅读全文
posted @ 2013-03-31 13:00 LJ_COME!!!!! 阅读(225) 评论(0) 推荐(0)
摘要: 树形DP,f(i,j)表示i节点及其子树得到j个国家所需的最小贿赂,对于j==i子树的节点总数sum,所需的最小费用肯定就是i节点本身的cost,对于j<sum的情况,肯定只有在其子树中选,如果选了i就是把整个子树都选了,然后,这个过程用的是01背包的思想,不知道这个词用的 恰不恰当,但想清楚,这个DP过程就可以了,对每个i的子树,恩。//思路来啦 #include <iostream> #include <cstdio> #include <cstring> #define mem(a,b) memset(a,b,sizeof(a)) #define 阅读全文
posted @ 2013-03-30 12:36 LJ_COME!!!!! 阅读(191) 评论(0) 推荐(0)
摘要: 状态压缩,看了周伟的动态规划之状态压缩,讲解的很详细,从写程序,到ac花了7个小时,3个小时敲代码,并理思路,4个小时调错,最后发现还是粗心问题,算法上病没有错误,不能在等啦,以后wa后,先仔细把代码看一遍,要有耐心呢,不能过度依赖调试,可能后者会浪费更多的时间#include <iostream> #include <cstdio> #include <string.h> #define max(a,b) ((a)>(b)?(a):(b)) using namespace std; char g[100+10][10+10]; int c[65]; 阅读全文
posted @ 2013-03-28 22:03 LJ_COME!!!!! 阅读(151) 评论(0) 推荐(0)
摘要: 典型的二位费用背包问题,主要是边界的考虑#include <iostream> #include <cstdio> #include <cstring> #define mem(a,b) memset(a,b,sizeof(a)) #define max(a,b) ((a)>(b)?(a):(b)) using namespace std; const int inf=0x3f3f3f3f; int f[100+10][1000+10]; int w[100+10],v[100+10]; int main() { int t; cin>>t 阅读全文
posted @ 2013-03-26 15:02 LJ_COME!!!!! 阅读(126) 评论(0) 推荐(0)
上一页 1 2 3 4 5 6 7 8 9 ··· 17 下一页