【状压DP】2017.9.24杂题[网格填数]题解
来源:互联网 发布:音乐制作软件 编辑:程序博客网 时间:2024/06/17 08:38
题目概述
给出一个
解题报告
DFS明显是不行的,然后数据这么小考虑状压。
如果定义
所以双状压QAQ (真恶心) ,定义
示例程序
#include<cstdio>#include<algorithm>using namespace std;const int maxn=20,maxm=5,maxs=32,maxh=161051,MOD=1e9+7;int n,m,a[maxn+5],b[maxm+5],num[maxm+5];int Ba,Ha,S,f[maxn+5][maxs][maxh];#define Pos(x,len) (((x)>>(len))&1)inline int Count(int s){ int sum=Pos(s,0); for (int j=1;j<m;j++) sum+=Pos(s,j-1)==0&&Pos(s,j)==1; return sum;}inline void AMOD(int &x,int tem) {if ((x+=tem)>=MOD) x-=MOD;}inline bool getnum(int s,int t,int k){ for (int j=1;j<=m;j++) { num[j]=k%Ba;k/=Ba;num[j]+=Pos(s,j-1)==0&&Pos(t,j-1)==1; if (num[j]>b[j]) return false; } return true;}int DP(){ Ba=(n+1>>1)+1;Ha=1;for (int i=1;i<=m;i++) Ha*=Ba; S=1<<m;f[0][0][0]=1; for (int i=1;i<=n;i++) for (int s=0;s<S;s++) if (Count(s)==a[i-1]) for (int k=0;k<Ha;k++) if (f[i-1][s][k]) for (int t=0;t<S;t++) if (Count(t)==a[i]) { if (!getnum(s,t,k)) continue; int now=0;for (int j=m;j>=1;j--) now=now*Ba+num[j]; AMOD(f[i][t][now],f[i-1][s][k]); } int lst=0,ans=0;for (int i=m;i>=1;i--) lst=lst*Ba+b[i]; for (int s=0;s<S;s++) if (Count(s)==a[n]) AMOD(ans,f[n][s][lst]); return ans;}int main(){ freopen("grid.in","r",stdin); freopen("grid.out","w",stdout); scanf("%d%d",&n,&m); if (n>m) { for (int i=1;i<=n;i++) scanf("%d",&a[i]); for (int i=1;i<=m;i++) scanf("%d",&b[i]); } else { for (int i=1;i<=n;i++) scanf("%d",&b[i]); for (int i=1;i<=m;i++) scanf("%d",&a[i]); swap(n,m); } return printf("%d\n",DP()),0;}
阅读全文
0 0
- 【状压DP】2017.9.24杂题[网格填数]题解
- 【BZOJ】【P2734】【HNOI2012】【集合选数】【状压DP】【题解】
- 填数
- 填数
- 填数
- [SCOI2009]windy数 题解动态规划DP
- NOIP2000 题解 方格取数 【DP】
- 【BZOJ1026】【数位DP】windy数 题解
- 【状压DP】chess 题解
- 【数位DP】DP special train T2 山峰数 题解
- C语言(24)蛇形填数
- NYOJ---蛇形填数(方块填数+三角填数)
- 蛇形填数(方块填数+三角形填数)
- 【java】蛇形填数 螺旋填数
- 有趣的数 算法的题解(数位DP问题)
- 二、Noip2000,方格取数题解(DP)
- 矩阵填数
- 蛇形填数
- 9.17日常总结
- B1026.(C)程序运行时间[mk]
- 两种方式创建Docker 基本映像
- Redis的“死键”问题
- String类和StringBuffer类的区别
- 【状压DP】2017.9.24杂题[网格填数]题解
- C运算符优先级
- logback自定义写入,和不加加载问题
- 【算法课程作业】扫雷游戏
- Angular4 实现多图片上传预览
- Jetty修改默认端口
- PPの浅谈基础数据(一)
- 用javac编译.java文件
- Kotlin实现一个简单的登录界面