poj1321——棋盘问题——————【状态压缩、动态规划】
来源:互联网 发布:网络分层物理层 编辑:程序博客网 时间:2024/05/22 13:56
/*
解题思路:首先确定各个状态值对应的二进制中有几个1。然后初始化dp[0][0]为一种解决方案,虽然不会计入最后的结果。但是却影响着下面每行的计算。只对二进制中1的个数小于等于k的状态值操作,枚举每种状态值。本行j状态值下的方案数继承上一行j状态值下的方案数,上一行中状态为j时的dp数组如果是0时,对本行的dp结果其实无影响,产生影响的是dp[i-1][j]不为0的那个。由上一行的状态值j如果能跟#对应的状态值不冲突,则扩展出新的状态值,新的状态值对应的dp数组需要保留原来j状态的dp值(方案数)。通过两个方式来更新dp数组,一个是本行继承上一行相同状态值的dp值,另一个是在上一行j状态值基础上扩展出的本行新的状态值继承上一行j状态值的dp值。
*/
#include<stdio.h>#include<string.h>#include<algorithm>#include<iostream>using namespace std;int n,k,top;char Map[10][10];int dp[10][1<<10],legal[1<<10];void cal_legal(){ //计算每种状态值对应的二进制中的1的个数 top=1<<n; //最大的状态值 for(int i=0;i<top;i++){ int num=0; for(int j=0;j<n;j++){ if(i&(1<<j)){ num++; } } legal[i]=num; }}int main(){ while(scanf("%d%d",&n,&k)!=EOF&&(n+k)!=-2){ getchar(); memset(dp,0,sizeof(dp)); memset(legal,0,sizeof(legal)); for(int i=1;i<=n;i++){ //从下标为1开始入图 gets(Map[i]+1); //从下标为1开始入图 } cal_legal(); dp[0][0]=1; //初始化dp[0][0]为一种方案,用以在下一行的时候跟每个#组合 //即扩展下一行的2的次方这些状态值 for(int i=1;i<=n;i++){ //计算每行各状态值下的方案数 for(int j=0;j<top;j++){ //遍历上一行各种状态值,用以跟#组合 if(legal[j]<=k){ //选择状态值对应二进制中1个数小于等于k的 dp[i][j]+=dp[i-1][j]; //将状态值相同的方案数在本行继承下来,保留上边那些行在 //该状态下的方案数 for(int u=1;u<=n;u++){ if(Map[i][u]=='#'&&(j&(1<<(u-1)))==0){ //找到为#的位置保证二进制跟状态值j不冲突 int newlegal=j|(1<<(u-1));//扩展出新的状态值 dp[i][newlegal]+=dp[i-1][j]; //新的状态值继承j的方案数,即新扩展又多了一个棋子后的方案数 //保留在j状态下的方案数 } } } } }// for(int i=0;i<top;i++){// if(i<10)// printf("%d ",i);// else// printf("%d ",i);// }//// printf("\n");// for(int i=0;i<=n;i++){//// for(int j=0;j<top;j++){//// printf("%d ",dp[i][j]);// }printf("\n");// } int ans=0; for(int i=0;i<top;i++){ if(legal[i]==k){ ans+=dp[n][i]; } } printf("%d\n",ans); }}/*4 3..##.##..#..#...4 4..##.##..#..#...4 2..##.##..#..#...*/
0 0
- poj1321——棋盘问题——————【状态压缩、动态规划】
- poj1321——棋盘问题
- POJ1321——棋盘问题
- POJ1321——棋盘问题
- poj1321——棋盘问题
- poj1321——棋盘问题(DFS)
- POJ1321 棋盘问题 —— DFS回溯
- 动态规划——Relocation 动态规划+状态压缩
- poj1191棋盘分割—典型动态规划
- 动态规划——状态压缩入门级
- poj1321 棋盘问题,状态压缩dp
- poj1321 棋盘问题(状态压缩)
- 0016算法笔记——【动态规划】图像压缩问题
- 0016算法笔记——【动态规划】图像压缩问题
- 0016算法笔记——【动态规划】图像压缩问题
- HDU2067——小兔的棋盘(迷宫,动态规划)
- 动态规划——图像压缩
- nyoj85——炮兵阵地——————【状态压缩、动态规划】
- 关于JSF/PF+Hibernate+JPA(web开发中)数据的添加,更新,以及界面数据显示小结(图片待传)
- #1107 : Shortest Proper Prefix
- 硬脂酸钙产物格量
- AndroidStudio安装和配置
- Nginx 中处理 HTTP 请求
- poj1321——棋盘问题——————【状态压缩、动态规划】
- JAVA经典算法40题
- linux卸载mysql,安装mysql
- 响应式网页设计——学习笔记一
- [IOS]用新申请的开发者账号获取开发证书/发布证书/推送证书
- poj3278(简单的bfs)
- Java NIO介绍(二)
- Android UI系列-----Dialog对话框
- 动态规划 最大子数组