• 状态压缩-动态规划


    状态压缩-动态规划

    ---By蒟蒻鱼

    用二进制表示城市的到达(规划的)状态
    每一个二进制数都代表一个唯一的十进制数


    预备知识

    • 位运算

    优先级

    ~
    << 和 >>
    &
    ^
    |

    按位与 & 全一则一,否则为零

    按位或 | 有一则一,否则为零

    按位取反 ~ 是零则一,是一为零

    按位异或 ^ 不同则一,相同为零

    移位 >> <<


    基本运算:

    集合取并 A|B

    集合取交 A&B

    集合相减 A&~B

    集合相减 ALLBITS~A

    置位 A|1<<bit

    清位 A^(1<<bit)


    TSP问题

    dp[i][j]代表已经走过城市的方案为i,当前所在j号城市的最短路径的长度
    DP方程:
    dp[i][j]=min(dp[i^(1<<j-1)][k]+dis[k][j])
    i^(1<<j-1)清除j的前驱

    合法布阵问题

    corn fields

    玉米田
    时间限制:2000毫秒内存限制:65536K
    提交总数:21933接受:11472
    描述

    农场主约翰购买了一个郁郁葱葱的新矩形牧场,由m×n(1≤m≤12;1≤n≤12)个方形地块组成。他想在一些广场上为奶牛种些好吃的玉米。遗憾的是,有些广场是不孕的,不能种植。Canny FJ知道奶牛不喜欢互相靠近吃东西,所以在选择种植哪种方块时,他避免选择相邻的方块;没有两个选择的方块共用一个边。他还没有最终决定种植哪种方块。

    作为一个非常开明的人,农夫约翰想考虑所有可能的选择,如何选择广场种植。他是如此的开明,他认为选择没有广场是一个有效的选择!请帮助农夫约翰确定他可以选择种植方块的方法的数量。

    输入

    第1行:两个空格分隔的整数:m和n
    第2.m+1行:第i+1行描述牧场的第一行,用N个空格分隔的整数表示一个正方形是否可育(1表示可育,0表示不可育)
    产量

    第1行:一个整数:FJ选择平方模10000000的方法数。

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    const int mod=100000000;
    
    int n,m;
    int st[1<<12],map[1<<12];//分别表示每一行的状态和草地的状态
    int dp[15][1<<12]; 
    
    int main()
    {
    	scanf("%d%d",&n,&m);
    	int x;
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=m;j++)
    		{
    			scanf("%d",&x);
    			if(x==0)map[i]=map[i]|(1<<j-1);
    		}
    	int k=0;
    	for(int i=0;i<(1<<m);i++)//计算每行合法的放置方式 
    	{
    		if(!(i&(i<<1)))
    			st[++k]=i;
    	}
    	for(int i=1;i<=k;i++)//特判第一行 
    	{
    		if(!(st[i]&map[1]))dp[1][i]=1;
    	}
    	for(int i=2;i<=n;i++)//枚举行数 
    	{
    		for(int j=1;j<=k;j++)//枚举放置的方法2 
    		{
    			if(!(map[i]&st[j])) //j这种情况是否成立,即没有在贫瘠的土地上放牛 
    			for(int r=1;r<=k;r++)
    			{
    				if(!(map[i-1]&st[r]))
    				{
    					if(!(st[j]&st[r]))//r这种情况是否成立,即满足不与上一行的情况存在相邻 
    						dp[i][j]+=dp[i-1][r];
    				}
    			} 
    		}
    	}
    	int ans=0;
    	for(int i=1;i<=k;i++)
    	
    	{
    		ans=(ans+dp[n][i])%mod;//计算方案数总和 
    	}
    	printf("%d",ans);
    	return 0;
    }
    

    持续更新


    end

  • 相关阅读:
    方向ajax(http long request实现实时通信)
    HTTP防盗链与反防盗链
    linux开启过程详解
    自动化运维工具----saltstack安装及配置
    python----网络编程(TCP通讯)
    windows----bat方式实现ftp推送
    shell----ftp推送
    python----FTP文件拉取(new)
    haproxy----四层负载均衡
    python----时间转换
  • 原文地址:https://www.cnblogs.com/XJack/p/10868920.html
Copyright © 2020-2023  润新知