打模板的经验:

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的更多相关文章

  1. bzoj 1187: [HNOI2007]神奇游乐园 插头dp

    1187: [HNOI2007]神奇游乐园 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 668  Solved: 337[Submit][Statu ...

  2. 动态规划之插头DP入门

    基于联通性的状态压缩动态规划是一类非常典型的状态压缩动态规划问题,由于其压缩的本质并不像是普通的状态压缩动态规划那样用0或者1来表示未使用.使用两种状态,而是使用数字来表示类似插头的状态,因此.它又被 ...

  3. 初探 插头DP

    因为这题,气得我火冒三丈! 这数据是不是有问题啊!我用cin代替scanf后居然就AC了(本来一直卡在Test 18)!导致我调(对)试(排)了一个小时!! UPD:后来细细想想,会不会是因为scan ...

  4. [入门向选讲] 插头DP:从零概念到入门 (例题:HDU1693 COGS1283 BZOJ2310 BZOJ2331)

    转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/7326874.html 最近搞了一下插头DP的基础知识……这真的是一种很锻炼人的题型…… 每一道题的状态都不一样 ...

  5. bzoj 1210 [HNOI2004] 邮递员 插头dp

    插头dp板子题?? 搞了我一晚上,还tm全是抄的标程.. 还有高精,哈希混入,还是我比较弱,orz各种dalao 有不明白的可以去看原论文.. #include<cstdio> #incl ...

  6. [HNOI2007]神奇游乐园(插头DP)

    题意:n*m的矩阵内值有正有负,找一个四连通的简单环(长度>=4),使得环上值的和最大. 题解:看到2<=m<=6和简单环,很容易想到插头DP,设f[i][j][k]表示轮廓线为第i ...

  7. BZOJ.1210.[HNOI2004]邮递员(插头DP Hash 高精)

    BZOJ 洛谷 http://www.cnblogs.com/LadyLex/p/7326874.html 插头DP.\(m+1\)个插头的状态需要用三进制表示:\(0\)表示无插头,\(1\)表示是 ...

  8. bzoj 1814 Ural 1519 Formula 1 ——插头DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1814 普通的插头 DP .但是调了很久.注意如果合并两个 1 的话,不是 “把向右第一个 2 ...

  9. LG5056 【模板】插头dp

    题意 题目背景 ural 1519 陈丹琦<基于连通性状态压缩的动态规划问题>中的例题 题目描述 给出n*m的方格,有些格子不能铺线,其它格子必须铺,形成一个闭合回路.问有多少种铺法? 输 ...

随机推荐

  1. Mac Apache WebServer 服务器配置

    前言 Apache 是目前使用最广的 Web 服务器,可以支持各种脚本的执行. Mac 系统自带,无需单独安装,只需要修改几个配置就可以,简单,快捷. 有些特殊的服务器功能,Apache 都能很好的支 ...

  2. Android 组件系列-----Activity初步

    在上篇博文讲解了Android的Activity这个组件的启动流程后,接下来我们就来看看我们的Activity与我们的布局文件的关系吧 我们先来看看一个最简单的布局文件的内容: <Relativ ...

  3. C++赋值兼容原则

    C++赋值兼容原则(派生类对象是基类对象,反之不成立) –基类指针强制转换成派生类指针 –派生类中重定义基类成员(同名覆盖) 假设, 一个基类 "普通人", 一个派生类 " ...

  4. Python CBV和FBV

    ''' 说一下CBV(class+base+views)和FBV(function+base+views),我们之前Django 里写的都是FBV,今天看一下 CBV,也就是在我们的视图函数里写类 ' ...

  5. 全面理解Javascript闭包和闭包的几种写法及用途【转】

    一.什么是闭包和闭包的几种写法和用法 1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1. ...

  6. SourceInsight: sourceInsight4.0 修改默认字体

    快捷键 Alt + Y

  7. 【Java】浅谈HashMap

    HashMap是常用的集合类,以Key-Value形式存储值.下面一起从代码层面理解它的实现. 构造方法 它有好几个构造方法,但几乎都是调此构造方法: public HashMap(int initi ...

  8. python bottle框架 解决跨域问题的正确方式

    经查询,网上有几种说法 https://www.cnblogs.com/EmptyFS/p/6138923.html 我首先查到的就是这个,我采用了文中所说的修改源码的方式, 但是经测试发现,修改源码 ...

  9. TCP中的KeepAlive与HTTP中的Keep-Alive

    KeepAlive 与 Keep-Alive 前言 昨天被问到了HTTP中Keep-Alive的概念,看名字我只知道是保持连接用的,但是对于他怎么结束连接,为什么要用他这些就不是很清楚了,今天查了一下 ...

  10. 不8000就业,不还实习费的AICODER全栈实习二期开始报名

    4月17日是个伟大的日子,AICODER全栈实习一期班,正式开始!伙伴们已经撸起袖子加油干了. 二期班开始报名 二期班定于5月17日开班,从二期班开始,实习费用调整如下: 三个月模式实习费,调整为12 ...