codeforces Diagrams & Tableaux1 (状压DP)
http://codeforces.com/gym/100405
D题
题在pdf里
D - Diagrams & Tableaux A Young diagram is an arrangement of boxes in rows and columns conforming to the following rules: the boxes in each row and each column are contiguous, the left borders of all rows are aligned, and each row is not longer than the one above. Here are some examples of Young diagrams: A semi-standard Young tableau for a given number N is a Young diagram that has its boxes filled according to the following rules: Each box contains a single integer between 1 and N, inclusive, each integer is greater than or equal to the integer in the box to its left, and each integer is strictly greater than the integer in the box above. Here is a list of all semi-standard Young tableaux for N = 3, based on a particular Young diagram: 1 2 1 1 3 1 1 2 2 1 3 2 1 2 3 1 3 3 2 3 2 2 3 3 Your task is to count how many semi-standard Young tableaux are possible, based on a given Young diagram, with a given N. Input Each test case consists of two lines. The first line of each test case specifies the Young diagram. This line starts with the number k satisfying 1 k 7, the number of rows, followed by k positive integers l1, l2, . . . , lk. These integers specify the number of boxes on each row of the Young diagram, and they satisfy 7 l1 l2 lk 1. The second line contains the integer N, satisfying k N 7. Output For each test case, print one line containing the number of semi-standard Young tableaux based on the given Young diagram, with the given N. 9 Problem D: Diagrams & Tableaux Example input output 1 1 1 1 1 2 2 2 1 4 4 3 2 1 1 4 1 2 20 20 10 |
题意:
给出一个那种形状,由很多个方格组成。每个方格中可以放1~N中的一个数,要求方格中的数大于上面相邻方格中的数,大于等于左边相邻方格的数。求有多少种放法。
给出k,表示有k行,然后给出各行的方格数。然后给出N。
题解:
状压DP。
因为一列要求下面大于上面,即不能等于,每种数字只能用一次,可以用状态的二进制位表示有无哪个数字,于是2^7=128,用0~127就能表示一列的所有状态。
然后状态转移,相邻两列转,枚举所有情况也就127^2。
然后一共最多7列,转转就得了。
注意结果大,用long long。
代码:
- //#pragma comment(linker, "/STACK:102400000,102400000")
- #include<cstdio>
- #include<cmath>
- #include<iostream>
- #include<cstring>
- #include<algorithm>
- #include<cmath>
- #include<map>
- #include<set>
- #include<stack>
- #include<queue>
- using namespace std;
- #define ll long long
- #define usll unsigned ll
- #define mz(array) memset(array, 0, sizeof(array))
- #define mf1(array) memset(array, -1, sizeof(array))
- #define minf(array) memset(array, 0x3f, sizeof(array))
- #define REP(i,n) for(i=0;i<(n);i++)
- #define FOR(i,x,n) for(i=(x);i<=(n);i++)
- #define RD(x) scanf("%d",&x)
- #define RD2(x,y) scanf("%d%d",&x,&y)
- #define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z)
- #define WN(x) printf("%d\n",x);
- #define RE freopen("D.in","r",stdin)
- #define WE freopen("huzhi.txt","w",stdout)
- #define mp make_pair
- #define pb push_back
- #define pf push_front
- #define ppf pop_front
- #define ppb pop_back
- const double pi=acos(-1.0);
- const double eps=1e-;
- int k,n;
- int a[];
- //int cntt[133];
- int cnt(int st) {
- //if(cntt[st]!=-1)return cntt[st];
- int t=,tt=st;
- while(tt) {
- if(tt&)t++;
- tt>>=;
- }
- //cntt[st]=t;
- return t;
- }
- //int okk[133][133];
- int ok(int j,int k) {
- //if(okk[j][k]!=-1)return okk[j][k];
- if(cnt(j)<cnt(k)) {
- //okk[j][k]=0;
- return ;
- }
- int tk=k,tj=j,ck=,cj=;
- while(tk) {
- if(tk&==) {
- while(tj) {
- if(tj&==) {
- if(cj>ck) {
- //okk[j][k]=0;
- return ;
- }
- cj++;
- tj>>=;
- break;
- }
- cj++;
- tj>>=;
- if(!tj)while();
- }
- }
- ck++;
- tk>>=;
- }
- //okk[j][k]=1;
- return ;
- }
- ll d[][];
- int c[],mj;
- ll farm() {
- int i,j;
- int maxst=<<n;
- //printf("maxst = %d\n",maxst);
- mz(d);
- FOR(k,,maxst-)
- if(cnt(k)==c[])d[][k]=;
- FOR(i,,mj) {
- FOR(j,,maxst-) {
- FOR(k,,maxst-) {
- if(d[i-][j]!= && cnt(k)==c[i] && cnt(j)==c[i-] && ok(j,k)) {
- d[i][k]+=d[i-][j];
- //printf("d[%d][%x]=%I64d , d[%d][%x]=%I64d\n",i-1,j,d[i-1][j] ,i,k,d[i][k]);
- }
- }
- }
- }
- ll re=;
- FOR(i,,maxst-)re+=d[mj][i];
- return re;
- }
- int main() {
- int i,j;
- //mf1(cntt);
- //mf1(okk);
- while(RD(k)!=EOF) {
- mz(c);
- FOR(i,,k) {
- RD(a[i]);
- FOR(j,,a[i])c[j]++;
- }
- mj=a[];
- RD(n);
- printf("%I64d\n",farm());
- }
- return ;
- }
codeforces Diagrams & Tableaux1 (状压DP)的更多相关文章
- UVaLive 6625 Diagrams & Tableaux (状压DP 或者 DFS暴力)
题意:给一个的格子图,有 n 行单元格,每行有a[i]个格子,要求往格子中填1~m的数字,要求每个数字大于等于左边的数字,大于上边的数字,问有多少种填充方法. 析:感觉像个DP,但是不会啊...就想暴 ...
- codeforces#1215E. Marbles(状压DP)
题目大意:给出一个由N个整数组成的序列,通过每次交换相邻的两个数,使这个序列的每个相同的数都相邻.求最小的交换次数. 比如给出序列:1 2 3 2 1 ,那么最终序列应该是 1 1 2 2 3 ,最小 ...
- codeforces 11D(状压dp)
传送门:https://codeforces.com/problemset/problem/11/D 题意: 求n个点m条边的图里面环的个数 题解: 点的范围只有19,很容易想到是状压. dp[sta ...
- Codeforces Gym 100015F Fighting for Triangles 状压DP
Fighting for Triangles 题目连接: http://codeforces.com/gym/100015/attachments Description Andy and Ralph ...
- Codeforces Gym 100610 Problem K. Kitchen Robot 状压DP
Problem K. Kitchen Robot Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/10061 ...
- 状压dp Codeforces Beta Round #8 C
http://codeforces.com/contest/8/problem/C 题目大意:给你一个坐标系,给你一个人的目前的坐标(该坐标也是垃圾桶的坐标),再给你n个垃圾的坐标,这个人要捡完所有的 ...
- Educational Codeforces Round 13 E. Another Sith Tournament 状压dp
E. Another Sith Tournament 题目连接: http://www.codeforces.com/contest/678/problem/E Description The rul ...
- Codeforces Round #321 (Div. 2) D. Kefa and Dishes(状压dp)
http://codeforces.com/contest/580/problem/D 题意: 有个人去餐厅吃饭,现在有n个菜,但是他只需要m个菜,每个菜只吃一份,每份菜都有一个欢乐值.除此之外,还有 ...
- Codeforces Beta Round #8 C. Looking for Order 状压dp
题目链接: http://codeforces.com/problemset/problem/8/C C. Looking for Order time limit per test:4 second ...
随机推荐
- Enum遇到下拉框
package com.zj.tool; public enum WeekDay { Mon(), Tue(), Wed(), Thu(), Fri(), Sat(), Sun(); /**定义枚举类 ...
- eclipse各版本代号
从2006年起,Eclipse基金会每年都会安排同步发布(simultaneous release).同步发布主要在6月进行,并且会在接下来的9月及2月释放出SR1及SR2版本.如下图所示的版本历史: ...
- POJ2195 Going Home
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22091 Accepted: 11156 Description On ...
- C#的委托和事件(delegate)
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Dele ...
- @EmbeddedId和@idClass的区别
@idClass 使复合主键类成为非嵌入类,使用 @IdClass 批注为实体指定一个复合主键类(通常由两个或更多基元类型或 JDK 对象类型组成).从原有数据库映射时(此时数据库键由多列组成),通常 ...
- 使用IDEA进行远程调试
虽然很早以前就只有Eclipse和IDEA都支持远程调试功能的,但是基本没怎么使用过,今天因为紧急处理一个问题,而本地环境搭建起来比较麻烦,所以就使用了IDEA的远程调试功能.因此写一篇文章记录一下. ...
- SDUT 1400 马的走法(回溯法)
题目链接: 传送门 马的走法 Time Limit: 1000MS Memory Limit: 65536K 题目描述 在一个4*5的棋盘上,马的初始位置坐标(纵 横)位置由键盘输入,求马能返 ...
- [转]vim编辑器---批量注释与反注释
转 在使用vim编写代码的时候,经常需要用到批量注释与反注释一段代码.下面简要介绍其操作. 方法一 块选择模式 插入注释: 用v进入virtual模式 用上下键选中需要注释的行数 按Control+v ...
- Java 序列化Serializable接口
1 什么是序列化和反序列化 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程. 2 什么情况下需要 ...
- IBatis一对多嵌套查询
1)类 public class AppData { // public int ModuleId { get; set; } public int DataId { get; set; } publ ...