hdu 1693 插头dp
2016-05-18 23:13
417 查看
前排推荐cdqppt 基于连通性状态压缩的动态规划问题
虽然没通过ppt完全看懂dp过程 但知道了插头和轮廓线两个概念
插头表示相邻格子的连接状态 轮廓线分割开了已决策和未决策
虽然没通过ppt完全看懂dp过程 但知道了插头和轮廓线两个概念
插头表示相邻格子的连接状态 轮廓线分割开了已决策和未决策
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define ll __int64 const int N=(1<<12)+10; int n,m,g[12][12]; ll dp[12][12] ; int main() { int T,kase=0; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&g[i][j]); memset(dp,0,sizeof dp); dp[0][m][0]=1; int bit=1<<(m+1); for(int i=1;i<=n;++i)//dp[i][j][k]记录决策到(i,j)是轮廓线上的插头状态为k时的种类数 k用状压方式表示插头状态 { for(int k=0;k<(bit>>1);++k) dp[i][0][k<<1]=dp[i-1][m][k];//初始化本行第0格 for(int j=1;j<=m;++j)//列 { for(int k=0;k<bit;++k)//状压插头状态 第i位为0表示第i个上无插头 { int x=1<<(j-1);//第j个 int y=1<<j;//第j+1个 if(g[i][j])//非障碍格 { dp[i][j][k]+=dp[i][j-1][k^x^y];//状态转移 好好画个图能够理解 但还有两种状态中少加了 if((k&x) && (k&y))continue; if(!(k&x) && !(k&y))continue;//上述两种状态 dp[i][j][k]+=dp[i][j-1][k];//补上上述两种状态少加的 } else//障碍格 { if(!(k&x) && !(k&y))dp[i][j][k]=dp[i][j-1][k]; else dp[i][j][k]=0; } } } } printf("Case %d: There are %I64d ways to eat the trees.\n",++kase,dp [m][0]); } return 0; }
相关文章推荐
- hdu_1790_The Balance(母函数)
- 说说Runnable与Callable
- 第二次人机界面设计
- java.security.spec.InvalidKeySpecException DerInputStream.getLength(): lengthTag=111, too big.
- linux常用的命令
- TortoiseSVN下载,安装,配置
- Qt Creator: Common Errors When Debugg
- hdu_4651_Partition(公式)
- Qt Creator: Common Errors When Debugg
- POJ 3624 Charm Bracelet (01背包 + 空间优化)
- hdu_4651_Partition(公式)
- Springboot入门(使用指南)
- O365(世纪互联)SharePoint 之站点个性化
- codeforces 675E E. Trains and Statistic(线段树+dp)
- ppt文字的边框怎么设置?
- nanopi2操作GPIO的4种方法
- 线程同步和异步问题-Java
- HTML注释和JSP注释的区别
- 人民大学 环境学院 雷洋(1987-2016)
- JavaScript的for循环写法及效率