1526. Martian Plates
http://acm.timus.ru/problem.aspx?space=1&num=1526
题目大意:
可以从n个碟子中任选一个放在桌子上(不断往上放),也可以把桌子上最顶端的盘子拿走
对于约束条件 i , j 是说假如 i 这个碟子还在桌子上,就不能拿走 j 这个碟子,也就等于放了
i 这个碟子就不能再放 j 了,因为放了 i 再放 j,就会相互约束,无法拿走碟子了。
思路:
可以把问题转化为括号匹配队列问题,左括号代表拿来碟子,右括号代表拿走碟子。
dp[x][y] , x 代表还有x个碟子可以放,y 代表已经放了的碟子的状态压缩表示
再放的形式就是 “ ( 递归1 ) 递归2 ”,根据y可以判定哪些括号可以放,枚举可以放的括号
括号确定后还要 枚举 “递归1” 的括号数量(偶数),对应的y需要更新,在 “递归1” 括号数量确定的情况下
“递归2” 的括号数量也确定了,对于“递归2” y 不需要更新
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<vector> using namespace std; const int N=205;
const int M=(1<<10);
int dp[N][M];
int p,t,n,m;
vector<int>unlike[N];
int put[M][11];
int fput(int y,int i)
{
if(put[y][i]!=-1)
return put[y][i];
for(unsigned int j=0;j<unlike[i].size();++j)
{
int k=unlike[i][j];
if((y&(1<<k))>0)
return (put[y][i]=0);
}
return (put[y][i]=1);
}
int dfs(int x,int y)
{
if(dp[x][y]!=-1)
return dp[x][y];
if(x==0)
return (dp[x][y]=1);
dp[x][y]=0;
for(int i=0;i<n;++i)
if(fput(y,i)==1)
{
for(int j=0;j+2<=x;j+=2)
{
dp[x][y]+=(dfs(j,y|(1<<i))*dfs(x-2-j,y));
dp[x][y]%=p;
}
}
return dp[x][y];
}
int main()
{
//freopen("data.in","r",stdin);
scanf("%d %d %d %d",&p,&t,&n,&m);
while(m--)
{
int i,j;
scanf("%d %d",&i,&j);
--i;--j;
unlike[j].push_back(i);
}
memset(dp,-1,sizeof(dp));
memset(put,-1,sizeof(put));
printf("%d\n",dfs(t,0));
return 0;
}
1526. Martian Plates的更多相关文章
- POJ 2948 Martian Mining
Martian Mining Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 2251 Accepted: 1367 Descri ...
- hrbust oj 1526+2028 树状数组
冒泡排序中 如果一个数的后面的某个数和这个数不符合排序规则 那么这个数就会在未来的某次冒泡中与那个数进行交换 这里用到了 树状数组求逆序数的办法来做 需要注意的是2028并不可以改完数组大小后直接套1 ...
- UVA 1366 九 Martian Mining
Martian Mining Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Sta ...
- hdu 1526(最大匹配)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1526 思路:floyd求传递闭包,然后就是最大匹配了,不过一开始输入没看清,被坑了将近2个小时. #i ...
- POJ 2498 Martian Mining
Martian Mining Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 2194 Accepted: 1326 De ...
- What is martian source / martian packets
Martian source / Martian packets In Linux, by default, packets are considered individually for routi ...
- 1941. Scary Martian Word
1941. Scary Martian Word 这道题 一个长度为3的字符串视为 一个 火星文 字母(ASCII 33-122) ,给出一个火星人认为恐怖的单词(由火星字母组成) 然后 给你一篇文章 ...
- ZOJ Martian Addition
Description In the 22nd Century, scientists have discovered intelligent residents live on the Mars. ...
- Codeforces 149 E. Martian Strings
正反两遍扩展KMP,维护公共长度为L时.出如今最左边和最右边的位置. . .. 然后枚举推断... E. Martian Strings time limit per test 2 seconds m ...
随机推荐
- 遗传算法在JobShop中的应用研究(part 6:结果显示)
def FormatSolution(s, C, I): T = [0 for j in xrange(I.n)] S = [[0 for t in I[j]] for j in xrange(I.n ...
- Qt qmake 使用(含遗留问题)
网上在介绍编译Qt的教程中,大多数都是这样提到编译的: 1, 运行 VS2012 x86 Native Tools Command Prompt 批处理 2, cd <install qt5.0 ...
- (译)关于async与await的FAQ
传送门:异步编程系列目录…… 环境:VS2012(尽管System.Threading.Tasks在.net4.0就引入,在.net4.5中为其增加了更丰富的API及性能提升,另外关键字”async” ...
- js基础:函数表达式和函数声明
函数表达式和函数声明的区别.实际上,解析器在向执行环境中加载数据是,对函数表达式和函数声明并非一视同仁.解析器会率先读取函数声明,并使其在执行任何代码之前可用.而函数表达式,则必须等到解析器执行到它所 ...
- .NET开源项目
综合类 微软企业库 微软官方出品,是为了协助开发商解决企业级应用开发过程中所面临的一系列共性的问题, 如安全(Security).日志(Logging).数据访问(Data Access).配置管 ...
- Scrum Meeting 13-20151221
任务安排 姓名 今日任务 明日任务 困难 董元财 无(数据库) 网络连接框架优化 无 胡亚坤 无(数据库) 优化商品搜索 无 刘猛 无 无 马汉虎 无 无 赖彦俞 无 无 燃尽图 团队照片 暂无 代码 ...
- iOS - AppRealTest App 真机测试
前言 1.准备 开发者账号 自从 Xcode7 出来之后,一般的真机测试不需要开发者账号,也就不需要看这篇教程,只有 app 具有 "推送" 等功能的时候,要真机测试就必须要开发者 ...
- android 实现类似qq未读消息点击循环显示
public void jumpUnread(boolean cycle) { List<ContactLogModel> dataList = adapter.getContactLog ...
- sshfs三步走----实用(mac)
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #ffffff } p.p2 { margin: 0.0px 0. ...
- javascript正则表达式
引用:http://www.jb51.net/article/72192.htm