好题。果然好题,经典了。

列一个计划,清明前做好状压DP。之后就刷剩下的MULTI。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std;
const int Status=(1<<8); int dp[2][11][Status][Status]; //滚动数组实现。dp[i][j][k][l],其中表示当前状态i(权且认为是i行),推出下一个状态next,i状态以前总共使用了
//j个骑士,ki-1行放骑士的状态,l是i行的状态,这时的放置方法数。答案DP就行。
bool crashpt[Status][Status]; //当前行状态与上两行的状态是否有不相容
bool crashpo[Status][Status]; //当前行(要推出的行)与上一行状是否有冲突
int total[Status]; //每种状态会用了多少个骑士。
int G[10],n; //G[i]表示第i行可放骑士的位置的情况,压 缩。
char str[10]; void predo(){
memset(crashpt,false,sizeof(crashpt));
memset(crashpo,false,sizeof(crashpo));
memset(total,0,sizeof(total));
for(int i=0;i<Status;i++){
for(int j=0;j<8;j++){
if(i&(1<<j)) total[i]++;
}
for(int j=0;j<Status;j++){
if((j&(i>>2))||(i&(j>>2))) crashpo[i][j]=true;
if((j&(i>>1))||(i&(j>>1))) crashpt[i][j]=true;
}
}
} void slove(){
int cur=0,next=1;
memset(dp[0],0,sizeof(dp[0]));
dp[cur][0][0][0]=1;
for(int i=0;i<8;i++){
for(int j=0;j<=n;j++){
for(int t=0;t<Status;t++){
for(int o=0;o<Status;o++){
if(!dp[cur][j][t][o]) continue;
for(int now=0;now<Status;now++){
if(j+total[now]>n) continue;
if((now&G[i+1])!=now) continue;
if(crashpt[now][t]||crashpo[now][o]) continue;
dp[next][j+total[now]][o][now]+=dp[cur][j][t][o];
}
}
}
}
memset(dp[cur],0,sizeof(dp[cur]));
swap(cur,next);
}
int ans=0;
for(int i=0;i<Status;i++){
for(int j=0;j<Status;j++)
ans+=dp[cur][n][i][j];
}
printf("%d\n",ans);
} int main(){
int T;
scanf("%d",&T);
predo();
while(T--){
scanf("%d",&n);
memset(G,0,sizeof(G));
for(int i=1;i<=8;i++){
scanf("%s",str);
for(int j=0;j<8;j++){
G[i]<<=1;
if(str[j]=='.') G[i]|=1;
}
}
slove();
}
return 0;
}

  

最新文章

  1. Scalaz(25)- Monad: Monad Transformer-叠加Monad效果
  2. Sharepoint学习笔记—习题系列--70-573习题解析 -(Q73-Q76)
  3. java7-4 继承的练习
  4. iOS - Swift NSNull 空值
  5. [笔记] MySql Workbench 导出表结构和数据报错 mysqldump: [ERROR] unknown variable &#39;delayed-insert=FALSE&#39;
  6. Spring通过AOP实现对Redis的缓存同步
  7. Spark中的wordCount程序实现
  8. idea找不到package下的mapper.xml文件
  9. 转 fiddler常见的应用场景
  10. 区间DP初探 P1880 [NOI1995]石子合并
  11. 【MySQL】MySQL的常规操作
  12. 【Postgres】PostgreSQL配置远程连接
  13. 2017/10 冲刺NOIP集训记录:暁の水平线に胜利を刻むのです!
  14. flask 中 session的源码解析
  15. 使用鼠标监听器,使鼠标悬停在JTable某行时背景色改变
  16. JavaScript技巧45招(转)
  17. c# 后台线程 访问前台控件并显示信息
  18. JAVA的文件操作【转】
  19. Map根据value排序
  20. CV2图像操作

热门文章

  1. 拼接sql ()
  2. js 调用微信浏览器内置方法,启动支付
  3. POJ 1584 计算几何
  4. 【转】linux下passwd命令设置修改用户密码
  5. DataFrame入门案例(集团公司对人事信息处理场景)
  6. scala控制流程语句
  7. 鼠标单击到 img行的时候图片隐藏方案
  8. C语言标准库头文件
  9. java中String类为什么要设计成final?
  10. 客户端通过base64上传bitmap服务器