【插头dp】 hdu4285 找bug
打模板的经验:
1.变量名取一样,换行也一样,不要宏定义
2.大小写,少写,大括号
- #include<algorithm>
- #include<iostream>
- #include<stdlib.h>
- #include<string.h>
- #include<math.h>
- #include<stdio.h>
- #include<vector>
- #include<queue>
- #include<string>
- #include<ctime>
- #include<stack>
- #include<map>
- #include<set>
- #include<list>
- using namespace std;
- #define rep(i,j,k) for(int i = (int)j;i <= (int)k;i ++)
- #define per(i,j,k) for(int i = (int)j;i >= (int)k;i --)
- #define debug(x) cerr<<#x<<" = "<<(x)<<endl
- #define mmm(a,b) memset(a,b,sizeof(a))
- #define pb push_back
- //#define x first
- //#define y second
- typedef double db;
- typedef long long ll;
- const int MAXD = 15;
- const int STATE = 1e6 + 5;
- const int HASH = 3e5 + 7;
- const int MOD = 1e9 + 7;
- int N, M, K;
- int maze[MAXD][MAXD];
- int code[MAXD];
- int ch[MAXD];
- int num;
- struct HASHMAP
- {
- int head[HASH], next[STATE], size;
- ll state[STATE];
- int f[STATE];
- void init()
- {
- size = 0;
- mmm(head, -1);
- }
- void push(ll st, int ans)
- {
- int i;
- int h = st % HASH;
- for (i = head[h]; i != -1; i = next[i])
- if (state[i] == st)
- {
- f[i] += ans;
- f[i] %= MOD;
- return;
- }
- state[size] = st;
- f[size] = ans;
- next[size] = head[h];
- head[h] = size++;
- }
- }hm[2];
- void decode(int *code, int m, long long st)
- {
- num = st & 63;
- st >>= 6;
- for (int i = m; i >= 0; i--)
- {
- code[i] = st & 7;
- st >>= 3;
- }
- }
- ll encode(int *code, int m)
- {
- int cnt = 1;
- mmm(ch, -1);
- ch[0] = 0;
- ll st = 0;
- rep(i, 0, m)
- {
- if (ch[code[i]] == -1)ch[code[i]] = cnt++;
- code[i] = ch[code[i]];
- st <<= 3;
- st |= code[i];
- }
- st <<= 6;
- st |= num;
- return st;
- }
- void shift(int *code, int m)
- {
- for (int i = m; i > 0; i--)code[i] = code[i - 1];
- code[0] = 0;
- }
- void dpblank(int i, int j, int cur)
- {
- int k, left, up;
- for (k = 0; k < hm[cur].size; k++)
- {
- decode(code, M, hm[cur].state[k]);
- left = code[j - 1];
- up = code[j];
- if (left&&up)
- {
- if (left == up)
- {
- if (num >= K)continue;
- int t = 0;
- for (int p = 0; p < j - 1; p++)
- if (code[p])t++;
- if (t & 1)continue;
- if (num < K)
- {
- num++;
- code[j - 1] = code[j] = 0;
- hm[cur ^ 1].push(encode(code, j == M ? M - 1 : M), hm[cur].f[k]);
- }
- }
- else
- {
- code[j - 1] = code[j] = 0;
- for (int t = 0; t <= M; t++)
- if (code[t] == up)
- code[t] = left;
- hm[cur ^ 1].push(encode(code, j == M ? M - 1 : M), hm[cur].f[k]);
- }
- }
- else if (left || up)
- {
- int t;
- if (left) t = left;
- else t = up;
- if (maze[i][j + 1])
- {
- code[j - 1] = 0;
- code[j] = t;
- hm[cur ^ 1].push(encode(code, M), hm[cur].f[k]);
- }
- if (maze[i + 1][j])
- {
- code[j] = 0;
- code[j - 1] = t;
- hm[cur ^ 1].push(encode(code, j == M ? M - 1 : M), hm[cur].f[k]);
- }
- }
- else
- {
- if (maze[i][j + 1] && maze[i + 1][j])
- {
- code[j - 1] = code[j] = 13;
- hm[cur ^ 1].push(encode(code, j == M ? M - 1 : M), hm[cur].f[k]);
- }
- }
- }
- }
- void dplock(int i, int j, int cur)
- {
- int k;
- for (k = 0; k < hm[cur].size; k++)
- {
- decode(code, M, hm[cur].state[k]);
- code[j - 1] = code[j] = 0;
- hm[cur ^ 1].push(encode(code, j == M ? M - 1 : M), hm[cur].f[k]);
- }
- }
- char str[20];
- void init()
- {
- cin >> N >> M >> K;
- mmm(maze, 0);
- rep(i, 1, N)
- {
- scanf("%s", &str);
- for (int j = 1; j <= M; j++)
- if (str[j - 1] == '.')
- maze[i][j] = 1;
- }
- }
- void solve()
- {
- int cur = 0;
- hm[cur].init();
- hm[cur].push(0, 1);
- rep(i, 1, N)
- rep(j, 1, M)
- {
- hm[cur ^ 1].init();
- if (maze[i][j])dpblank(i, j, cur);
- else dplock(i, j, cur);
- cur ^= 1;
- }
- int ans = 0;
- for (int i = 0; i < hm[cur].size; i++)
- if (hm[cur].state[i] == K)
- {
- ans += hm[cur].f[i];
- ans %= MOD;
- }
- printf("%d\n", ans);
- }
- int main()
- {
- int t;
- cin >> t;
- while (t--)
- {
- init();
- solve();
- }
- //cin >> t;
- }
- /*
- 2
- 4 4 1
- **..
- ....
- ....
- ....
- 4 1
- ....
- ....
- ....
- ....
- */
- /*
- HDU 4285
- 要形成刚好K条回路的方法数
- 要避免环套环的情况。
- 所以形成回路时,要保证两边的插头数是偶数
- G++ 11265ms 11820K
- C++ 10656ms 11764K
- */
- #include<stdio.h>
- #include<iostream>
- #include<algorithm>
- #include<string.h>
- using namespace std;
- const int MAXD=;
- const int STATE=;
- const int HASH=;//这个大一点可以防止TLE,但是容易MLE
- const int MOD=;
- int N,M,K;
- int maze[MAXD][MAXD];
- int code[MAXD];
- int ch[MAXD];
- int num;//圈的个数
- struct HASHMAP
- {
- int head[HASH],next[STATE],size;
- long long state[STATE];
- int f[STATE];
- void init()
- {
- size=;
- memset(head,-,sizeof(head));
- }
- void push(long long st,int ans)
- {
- int i;
- int h=st%HASH;
- for(i=head[h];i!=-;i=next[i])
- if(state[i]==st)
- {
- f[i]+=ans;
- f[i]%=MOD;
- return;
- }
- state[size]=st;
- f[size]=ans;
- next[size]=head[h];
- head[h]=size++;
- }
- }hm[];
- void decode(int *code,int m,long long st)
- {
- num=st&;
- st>>=;
- for(int i=m;i>=;i--)
- {
- code[i]=st&;
- st>>=;
- }
- }
- long long encode(int *code,int m)//最小表示法
- {
- int cnt=;
- memset(ch,-,sizeof(ch));
- ch[]=;
- long long st=;
- for(int i=;i<=m;i++)
- {
- if(ch[code[i]]==-)ch[code[i]]=cnt++;
- code[i]=ch[code[i]];
- st<<=;
- st|=code[i];
- }
- st<<=;
- st|=num;
- return st;
- }
- void shift(int *code,int m)
- {
- for(int i=m;i>;i--)code[i]=code[i-];
- code[]=;
- }
- void dpblank(int i,int j,int cur)
- {
- int k,left,up;
- for(k=;k<hm[cur].size;k++)
- {
- decode(code,M,hm[cur].state[k]);
- left=code[j-];
- up=code[j];
- if(left&&up)
- {
- if(left==up)
- {
- if(num>=K)continue;
- int t=;
- //要避免环套环的情况,需要两边插头数为偶数
- for(int p=;p<j-;p++)
- if(code[p])t++;
- if(t&)continue;
- if(num<K)
- {
- num++;
- code[j-]=code[j]=;
- hm[cur^].push(encode(code,j==M?M-:M),hm[cur].f[k]);
- }
- }
- else
- {
- code[j-]=code[j]=;
- for(int t=;t<=M;t++)
- if(code[t]==up)
- code[t]=left;
- hm[cur^].push(encode(code,j==M?M-:M),hm[cur].f[k]);
- }
- }
- else if(left||up)
- {
- int t;
- if(left)t=left;
- else t=up;
- if(maze[i][j+])
- {
- code[j-]=;
- code[j]=t;
- hm[cur^].push(encode(code,M),hm[cur].f[k]);
- }
- if(maze[i+][j])
- {
- code[j]=;
- code[j-]=t;
- hm[cur^].push(encode(code,j==M?M-:M),hm[cur].f[k]);
- }
- }
- else
- {
- if(maze[i][j+]&&maze[i+][j])
- {
- code[j-]=code[j]=;
- hm[cur^].push(encode(code,j==M?M-:M),hm[cur].f[k]);
- }
- }
- }
- }
- void dpblock(int i,int j,int cur)
- {
- int k;
- for(k=;k<hm[cur].size;k++)
- {
- decode(code,M,hm[cur].state[k]);
- code[j-]=code[j]=;
- hm[cur^].push(encode(code,j==M?M-:M),hm[cur].f[k]);
- }
- }
- char str[];
- void init()
- {
- scanf("%d%d%d",&N,&M,&K);
- memset(maze,,sizeof(maze));
- for(int i=;i<=N;i++)
- {
- scanf("%s",&str);
- for(int j=;j<=M;j++)
- if(str[j-]=='.')
- maze[i][j]=;
- }
- }
- void solve()
- {
- int i,j,cur=;
- hm[cur].init();
- hm[cur].push(,);
- for(i=;i<=N;i++)
- for(j=;j<=M;j++)
- {
- hm[cur^].init();
- if(maze[i][j])dpblank(i,j,cur);
- else dpblock(i,j,cur);
- cur^=;
- }
- int ans=;
- for(i=;i<hm[cur].size;i++)
- if(hm[cur].state[i]==K)
- {
- ans+=hm[cur].f[i];
- ans%=MOD;
- }
- printf("%d\n",ans);
- }
- int main()
- {
- //freopen("in.txt","r",stdin);
- //freopen("out.txt","w",stdout);
- int T;
- scanf("%d",&T);
- while(T--)
- {
- init();
- solve();
- }
- return ;
- }
- /*
- Sample Input
- 4 4 1
- **..
- ....
- ....
- ....
- 4 1
- ....
- ....
- ....
- ....
- Sample Output
- 6
- */
#include<algorithm>#include<iostream>#include<stdlib.h>#include<string.h>#include<math.h>#include<stdio.h>#include<vector>#include<queue>#include<string>#include<ctime>#include<stack>#include<map>#include<set>#include<list>using namespace std;#define rep(i,j,k) for(int i = (int)j;i <= (int)k;i ++)#define per(i,j,k) for(int i = (int)j;i >= (int)k;i --)#define debug(x) cerr<<#x<<" = "<<(x)<<endl#define mmm(a,b) memset(a,b,sizeof(a))#define pb push_back//#define x first//#define y second
typedef double db;typedef long long ll;
const int MAXD = 15;const int STATE = 1e6 + 5;const int HASH = 3e5 + 7;const int MOD = 1e9 + 7;int N, M, K;int maze[MAXD][MAXD];int code[MAXD];int ch[MAXD];int num;struct HASHMAP{int head[HASH], next[STATE], size;ll state[STATE];int f[STATE];void init(){size = 0;mmm(head, -1);}void push(ll st, int ans){int i;int h = st % HASH;for (i = head[h]; i != -1; i = next[i])if (state[i] == st){f[i] += ans;f[i] %= MOD;return;}state[size] = st;f[size] = ans;next[size] = head[h];head[h] = size++;}}hm[2];void decode(int *code, int m, long long st){num = st & 63;st >>= 6;for (int i = m; i >= 0; i--){code[i] = st & 7;st >>= 3;}}ll encode(int *code, int m){int cnt = 1;mmm(ch, -1);ch[0] = 0;ll st = 0;rep(i, 0, m){if (ch[code[i]] == -1)ch[code[i]] = cnt++;code[i] = ch[code[i]];st <<= 3;st |= code[i];}st <<= 6;st |= num;return st;}void shift(int *code, int m){for (int i = m; i > 0; i--)code[i] = code[i - 1];code[0] = 0;}void dpblank(int i, int j, int cur){int k, left, up;for (k = 0; k < hm[cur].size; k++){decode(code, M, hm[cur].state[k]);left = code[j - 1];up = code[j];if (left&&up){if (left == up){if (num >= K)continue;int t = 0;
for (int p = 0; p < j - 1; p++)if (code[p])t++;if (t & 1)continue;if (num < K){num++;code[j - 1] = code[j] = 0;hm[cur ^ 1].push(encode(code, j == M ? M - 1 : M), hm[cur].f[k]);}}else{code[j - 1] = code[j] = 0;for (int t = 0; t <= M; t++)if (code[t] == up)code[t] = left;hm[cur ^ 1].push(encode(code, j == M ? M - 1 : M), hm[cur].f[k]);}}else if (left || up){int t;if (left) t = left;else t = up;if (maze[i][j + 1]){code[j - 1] = 0;code[j] = t;hm[cur ^ 1].push(encode(code, M), hm[cur].f[k]);}if (maze[i + 1][j]){code[j] = 0;code[j - 1] = t;hm[cur ^ 1].push(encode(code, j == M ? M - 1 : M), hm[cur].f[k]);}}else{if (maze[i][j + 1] && maze[i + 1][j]){code[j - 1] = code[j] = 13;hm[cur ^ 1].push(encode(code, j == M ? M - 1 : M), hm[cur].f[k]);}}}}void dplock(int i, int j, int cur){int k;for (k = 0; k < hm[cur].size; k++){decode(code, M, hm[cur].state[k]);code[j - 1] = code[j] = 0;hm[cur ^ 1].push(encode(code, j == M ? M - 1 : M), hm[cur].f[k]);}}char str[20];void init(){cin >> N >> M >> K;mmm(maze, 0);rep(i, 1, N){scanf("%s", &str);for (int j = 1; j <= M; j++)if (str[j - 1] == '.')maze[i][j] = 1;}}void solve(){int cur = 0;hm[cur].init();hm[cur].push(0, 1);rep(i, 1, N)rep(j, 1, M){hm[cur ^ 1].init();if (maze[i][j])dpblank(i, j, cur);else dplock(i, j, cur);cur ^= 1;}int ans = 0;for (int i = 0; i < hm[cur].size; i++)if (hm[cur].state[i] == K){ans += hm[cur].f[i];ans %= MOD;}printf("%d\n", ans);
}int main(){int t;cin >> t;while (t--){init();solve();}//cin >> t;}/*24 4 1**..............4 1................*/
【插头dp】 hdu4285 找bug的更多相关文章
- bzoj 1187: [HNOI2007]神奇游乐园 插头dp
1187: [HNOI2007]神奇游乐园 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 668 Solved: 337[Submit][Statu ...
- 动态规划之插头DP入门
基于联通性的状态压缩动态规划是一类非常典型的状态压缩动态规划问题,由于其压缩的本质并不像是普通的状态压缩动态规划那样用0或者1来表示未使用.使用两种状态,而是使用数字来表示类似插头的状态,因此.它又被 ...
- 初探 插头DP
因为这题,气得我火冒三丈! 这数据是不是有问题啊!我用cin代替scanf后居然就AC了(本来一直卡在Test 18)!导致我调(对)试(排)了一个小时!! UPD:后来细细想想,会不会是因为scan ...
- [入门向选讲] 插头DP:从零概念到入门 (例题:HDU1693 COGS1283 BZOJ2310 BZOJ2331)
转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/7326874.html 最近搞了一下插头DP的基础知识……这真的是一种很锻炼人的题型…… 每一道题的状态都不一样 ...
- bzoj 1210 [HNOI2004] 邮递员 插头dp
插头dp板子题?? 搞了我一晚上,还tm全是抄的标程.. 还有高精,哈希混入,还是我比较弱,orz各种dalao 有不明白的可以去看原论文.. #include<cstdio> #incl ...
- [HNOI2007]神奇游乐园(插头DP)
题意:n*m的矩阵内值有正有负,找一个四连通的简单环(长度>=4),使得环上值的和最大. 题解:看到2<=m<=6和简单环,很容易想到插头DP,设f[i][j][k]表示轮廓线为第i ...
- BZOJ.1210.[HNOI2004]邮递员(插头DP Hash 高精)
BZOJ 洛谷 http://www.cnblogs.com/LadyLex/p/7326874.html 插头DP.\(m+1\)个插头的状态需要用三进制表示:\(0\)表示无插头,\(1\)表示是 ...
- bzoj 1814 Ural 1519 Formula 1 ——插头DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1814 普通的插头 DP .但是调了很久.注意如果合并两个 1 的话,不是 “把向右第一个 2 ...
- LG5056 【模板】插头dp
题意 题目背景 ural 1519 陈丹琦<基于连通性状态压缩的动态规划问题>中的例题 题目描述 给出n*m的方格,有些格子不能铺线,其它格子必须铺,形成一个闭合回路.问有多少种铺法? 输 ...
随机推荐
- 【SqlServer】解析SqlServer中的事务
目录结构: contents structure [+] 事务是什么 控制事务 数据并发访问产生的影响 事务的隔离级别 锁 NOLOCK.HOLDLOCK.UPDLOCK 死锁分析 在这篇Blog中, ...
- ES 插入十万条数据耗时1573秒
- JAVA代码实现多级树结构封装对象
树结构在开发中经常遇到.例如:部门.菜单.员工架构等等.下面用部门作为例子构造部门结构树 1.部门表:dept -- ---------------------------- -- Table str ...
- 【Tomcat】Tomcat 系统架构与设计模式,第 2 部分: 设计模式分析
这个分为两个部分的系列文章研究了 Apache Tomcat 服务器的系统架构以及其运用的很多经典设计模式.第 1 部分 分析了 Tomcat 的工作原理,第 2 部分将分析 Tomcat 中运用的许 ...
- (5) 电商场景下的常见业务SQL处理
1. 如何对评论进行分页展示 一般情况下都是这样写 SELECT customer_id,title,content FROM product_comment WHERE audit_status = ...
- Asp.Net 隐藏手机号中间四位为*方法
需求:15088881234 > 150****1234 方法1: "; , ) + , ); 方法2: "; string p2= Regex.Replace(phone ...
- 【iCore4 双核心板_ARM】例程十九:USBD_MSC实验——虚拟U盘
实验步骤: 1.将SD卡插在SD卡槽中. 2.将跳线冒跳至USB_OTG,将USB_OTG通过Micor USB线与USB主机(电脑)相连. 3.烧写程序,我的电脑中将出现一个磁盘. 实验现象: 核心 ...
- android 监听动画对象后不能播放动画
采用监听 AnimationListener 发现不能播放动画了. 解决办法: 将动画的启动方式:animation.startnow去掉,改为如下即可 view.startAnimation(an ...
- Qt动态库静态库的创建、使用、多级库依赖、动态库改成静态库等详细说明
本文描述的是windows系统下,通过qtcreator在pro文件中添加动态库与静态库的方法: 1.添加动态库(直接添加动态库文件.dll,非子项目) 通过qtcreator创建动态库的方法就不在此 ...
- c# 根据字段名,得到对象中的属性值
public string GetModelValue(string FieldName, object obj) { try { Type Ts = obj.GetType(); object o ...