[知识点]状态压缩DP
// 此博文为迁移而来,写于2015年7月15日,不代表本人现在的观点与看法。原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w6jf.html

其中k`表示上一行的状态,num(k)表示在当前行状态为k的情况下棋子的总个数。
#include cstring
#include algorithm
using namespace std;
{
int s=0,tmp=0;
while (x)
{
if (s && (x & 1)) return -1;
if (s=(x & 1)) tmp++;
x=x>>1;
}
return tmp;
}
{
int n,m,t;
while (scanf("%d %d %d",&n,&m,&t)!=EOF)
{
if (n<m) swap(n,m);
memset(f,0,sizeof(f));
f[0][0][0]=1;
for (int i=1;i<=n;i++)
for (int r=0;r<=t;r++)
for (int j=0;j<(1<<m);j++) // 当前的状态
{
int num=getNum(j); // 棋子个数
if (num==-1 || num>r) continue;
for (int k=0;k<(1<<m);k++) // 上次的状态转移
{
if (getNum(k)==-1 || k&j) continue;
f[i][j][r]+=f[i-1][k][r-num];
}
}
long long ans=0;
for (int i=0;i<(1<<m);i++) ans+=f[n][i][t];
printf("%lld\n",ans);
}
return 0;
}
分析:同样地,这道题用f[i][j][k]表示从(1,1)到(i,j)子矩阵中当所走路径状态为k的时候所得的最小权值,那么状态则是根据所走路径转换为二进制在转换为十进制来转移,就不多说了,看代码。
#include<cstring>
#define MAXN 11
#define INF 0x3f3f3f3f
const int two[MAXN]={1,2,4,8,16,32,64,128,256,512};
{
int temp=ki;
for (int i=9;i>=0;i--) if (temp>=two[i]) { temp-=two[i]; if (i==now) return ki; }
return (ki+two[now]);
}
{
memset(f,INF,sizeof(f));
for (int i=1;i<=10;i++)
for (int j=1;j<=10;j++) scanf("%d",&map[i][j]);
int t1=two[map[1][1]],t2=0;
f[1][1][t1]=map[1][1];
for (int i=2;i<=10;i++)
{
t2=getNum(t1,map[1][i]);
f[1][i][t2]=f[1][i-1][t1]+map[1][i];
t1=t2;
}
t1=two[map[1][1]];
for (int i=2;i<=10;i++)
{
t2=getNum(t1,map[i][1]);
f[i][1][t2]=f[i-1][1][t1]+map[i][1];
t1=t2;
}
for (int i=2;i<=10;i++)
for (int j=2;j<=10;j++)
{
for (int ki=1;ki<=(1<<10)-1;ki++)
{
if (f[i-1][j][ki]==INF) continue;
int k=getNum(ki,map[i][j]);
f[i][j][k]=min(f[i][j][k],f[i-1][j][ki]+map[i][j]);
}
for (int ki=1;ki<=(1<<10)-1;ki++)
{
if (f[i][j-1][ki]==INF) continue;
int k=getNum(ki,map[i][j]);
f[i][j][k]=min(f[i][j][k],f[i][j-1][ki]+map[i][j]);
}
}
for (int i=1;i<=1023;i++) if (f[3][3][i]!=INF) printf("i=%d %d\n",i,f[3][3][i]);
printf("%d",f[10][10][1023]);
return 0;
}
[知识点]状态压缩DP的更多相关文章
- hdu4336 Card Collector 状态压缩dp
Card Collector Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- 浅谈状态压缩DP
浅谈状态压缩DP 本篇随笔简单讲解一下信息学奥林匹克竞赛中的状态压缩动态规划相关知识点.在算法竞赛中,状压\(DP\)是非常常见的动规类型.不仅如此,不仅是状压\(DP\),状压还是很多其他题目的处理 ...
- hoj2662 状态压缩dp
Pieces Assignment My Tags (Edit) Source : zhouguyue Time limit : 1 sec Memory limit : 64 M S ...
- POJ 3254 Corn Fields(状态压缩DP)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4739 Accepted: 2506 Descr ...
- HDU-4529 郑厂长系列故事——N骑士问题 状态压缩DP
题意:给定一个合法的八皇后棋盘,现在给定1-10个骑士,问这些骑士不能够相互攻击的拜访方式有多少种. 分析:一开始想着搜索写,发现该题和八皇后不同,八皇后每一行只能够摆放一个棋子,因此搜索收敛的很快, ...
- DP大作战—状态压缩dp
题目描述 阿姆斯特朗回旋加速式阿姆斯特朗炮是一种非常厉害的武器,这种武器可以毁灭自身同行同列两个单位范围内的所有其他单位(其实就是十字型),听起来比红警里面的法国巨炮可是厉害多了.现在,零崎要在地图上 ...
- 状态压缩dp问题
问题:Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Ev ...
- BZOJ-1226 学校食堂Dining 状态压缩DP
1226: [SDOI2009]学校食堂Dining Time Limit: 10 Sec Memory Limit: 259 MB Submit: 588 Solved: 360 [Submit][ ...
- Marriage Ceremonies(状态压缩dp)
Marriage Ceremonies Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu ...
随机推荐
- jQuery Moblie 学习之page、button、theme、panel、listview、controlgroup、navbar等(一)
1.jQTouch jQTouch与jQuery Moblie十分相似,也是一个jQuery插件,同样也支持HTML页面标签驱动,实现移动设备视图切换效果.不同的是它是专为WebKit内核的浏览器打造 ...
- Delphi中uses在interfeace和implementation中的区别
use单元引入分为在interface中引入,如 interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Co ...
- java.lang.UnsupportedClassVersionError: org/xwiki/xxx : Unsupported major.minor version 51.0
此类问题主要是因为Unsupported major.minor version 51.0. 原因是JDK版本不一致导致的问题.在web应用中碰到此问题. 应用中规定使用JDK7.0,本地JDK为6. ...
- maven 错误: 程序包org.junit不存在
该错误在入门例子中使用mvn clean test时出现该错误. 原因: 测试用例应该放在src/test/java/...路径下,我是放在了src/main/java/..路径下了. 因为没有遵守其 ...
- <转>JDBC获取DB元数据
原文链接:http://jiauwu.iteye.com/blog/1307617 package com.util.jdbc; import java.sql.Connection; import ...
- JqueryDemoTools-用于整理jQueryDemo 分类: C# 公共资源 2014-12-02 16:50 224人阅读 评论(1) 收藏
应用背景: 在学习js时,为了熟悉某个功能,或使用某个插件,往往需要写一个Demo来测试:一些好的Demo也可以整理积累下来,方便以后查阅: 写了一个编写jQuery Demo的辅助工具.界面很简单, ...
- .NET NLog 详解(二)
Git是个很好的源码管理系统,你可以瞬间切换为任何历史版本.为了更好的解析NLog这个组件,我们将时钟倒拨回2004年.(注意:NLog v0.9 has been released 是在2005-0 ...
- 共享内存同行,王明学learn
共享内存同行 一.共享内存概念 共享内存是IPC机制中的一种,它允许两个不相关的进程访问同一段内存, 这是传递数据的一种非常有效的方式. 二.函数学习 这里主要有创建共享内存.映射共享内存.分离共享内 ...
- Effective C++ 之 Item 1: 视C++为一个语言联邦
Effective C++ Chapter 1. 让自己习惯C++(Accustoming Yourself to C++) Item 1. 视C++为一个语言联邦(View C++ as a fed ...
- java中如何实现类似goto的作法
goto虽然是java中保留的keyword,但是对于跳转这个语法对新手来说这个确实好用.为了提高程序的可靠性和可读性,Java语言目前是不支持无条件跳转的goto语句!! 幸亏java中有高仿跳转的 ...