随笔分类 -  动态规划--状压dp

摘要:以为是组合,后来看着像数位dp,又不知道怎么让它不重复用。。然后就没思路 了。其实状压就可以了 状压是可以确定一个数的使用顺序的 利用01也可以确定所有的数的使用以及不重复dp[i+1《《e][(j*10+p[e])%m]+=dp[i][j]; 排下序去掉重复的 或者最后除去每个数出现的次数 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include10 using namespace std;11 #define N 10000012 #define L. 阅读全文
posted @ 2014-03-11 21:21 _雨 阅读(270) 评论(0) 推荐(0)
摘要:一简单的状压题 比赛时跑偏了 ,脑子最近乱的跟浆糊似得呢。。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 int dp[15][5010],o[15][5010]; 9 int w[15][15],ee[15][15],s[15];10 int main()11 {12 int i,j,n,t,e;13 cin>>t;14 while(t--)15 {16 memset(dp,0,sizeof(dp));17... 阅读全文
posted @ 2014-02-15 16:58 _雨 阅读(210) 评论(0) 推荐(0)
摘要:1326用队列优化的 不知道为什么一直WA 传统直白的 状压 写了超时 O((1 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 #define N 110000010 #define INF 0xfffffff11 int dp[2][N];12 int p[25],o[110],sum[110];13 vectora[110];14 bool f[2][N],ff[25];15 int main()16 {17 int i,j,n,m,v,s=0;1... 阅读全文
posted @ 2014-02-11 17:21 _雨 阅读(488) 评论(0) 推荐(0)
摘要:链接预处理出只有四个1的情况存入数组中 然后状压下 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 1050000 8 int dp[2][N]; 9 int q[2][N];10 int pt[N];11 bool f[N];12 struct node13 {14 int x,y;15 }pp[25];16 bool cmp(node a,node b)17 {18 if(a.x==b.x)19 return a.y<b.y;20 ... 阅读全文
posted @ 2013-09-15 22:26 _雨 阅读(508) 评论(0) 推荐(0)
摘要:链接与上题类似 预处理一下各字符串之间最大的相同字符数就可以 注意dp要初始为负无穷 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 1050 8 int dp[N][11],k[11],q[2][N],w[12][12],f[N]; 9 char s[11][11];10 int compare(int x,int y)11 {12 int i,j,maxz=0;13 for(i = 0 ; i < k[x] ; i++)14 ... 阅读全文
posted @ 2013-08-19 15:11 _雨 阅读(305) 评论(0) 推荐(0)
摘要:链接这题卡了一天 刚开始没考虑第一个传的和最后一个传的 感觉挺简单 啪啪的敲完 居然还过了17组数据。。正解:dp数组一维保存状态 一维保存当前传到了谁 再枚举是由谁传过来的 这样可以保证正确性 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define INF 0xfffffff 8 #define M 100010 9 int dp[M][20],a[20][20],q[2][M],f[M];10 int main()11 {12 int i,j,k,n;13 ... 阅读全文
posted @ 2013-08-19 15:09 _雨 阅读(214) 评论(0) 推荐(0)
摘要:链接保存当前行和前一行两行的状态 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 10010 8 int a[N],dp[4][4][N],d[4]={0,1,1,2}; 9 int main()10 {11 int i,j,k,n,g;12 while(scanf("%d",&n)!=EOF)13 {14 memset(dp,0,sizeof(dp));15 for(i = 1; i a[i]||j>a[... 阅读全文
posted @ 2013-08-19 15:06 _雨 阅读(220) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=1185刚开始思路就错了 想着用保存这一行的状态 然后再去枚举前面两行的状态 这样不能保证前面两行的状态同时满足要求正解:保存两行的状态 再依次枚举前面的各种小错误不断啊 改的一个纠结。。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 char c; 8 int p[12],o[1050],dp[2][1050][1050],f[110],x[1050]; 9 int main() 10 { 11 in... 阅读全文
posted @ 2013-08-18 14:26 _雨 阅读(348) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=2411下次还是去学习下dfs的写法吧 自己乱写的好像有点乱 乱七八糟改了一通过了以1 1 表示横着的 1 0 表示竖着的 枚举每一行的状态 再枚举前一行的状态判断是否可以同存注意最后一行要特殊判断一下 0夹着着的1必须为偶数 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 3010 8 #define LL __int64 9 LL dp[15][N],o[2][N],k[15];10 int main()1. 阅读全文
posted @ 2013-08-17 19:42 _雨 阅读(330) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=3254第一个状压题 思路挺好想 用二进制表示每行的状态 然后递推用左移 右移来判断是不是01间隔出现 c大神教的 我的代码WA在这个地方了。。改了点 就A了 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define mod 100000000 8 #define LL long long 9 int a[15][15];10 LL dp[15][5050],s[15],num[2][5050],k[15],pp[15];1. 阅读全文
posted @ 2013-08-16 22:45 _雨 阅读(188) 评论(0) 推荐(0)