【LOJ#10172】涂抹果酱

摘要:
虽然问题仍然是状态压力dp,但不同的是问题的状态不能用二进制表示,而是需要三进制。三进制的特殊之处在于不能使用所有的位运算符,所以这个问题比通常的问题要多,即手写判断,而不是直接&,|,^幸运的是,这个主题的状态定义非常简单。定义f[i][j]表示当i行的状态为j时,第一个i行中的方案数。这样,这个主题与“国王”和“牧场的安排”非常相似,因此我在这里不再重复。1#包括<位/stdc++.h&

尽管本题依旧是状压dp,但是不同的是本题的状态无法用二进制表示,而需要三进制。三进制特殊的地方在于位运算符全都不能用了,因此本题比往常的题目多了一部分,就是手写判断,而不是直接&,|,^.

可喜的是,本题状态定义极其简单,定义f[i][j]表示第i行的状态为j时,前i行的方案数,这样一来,本题与“国王”“牧场的安排”很类似,在此不再赘述。

【LOJ#10172】涂抹果酱第1张【LOJ#10172】涂抹果酱第2张
 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 #define mod 1000000
 4 #define N 10005
 5 using namespace std;
 6 int n,m,K,ban,ans=0,sta[1005],tot=0,stat,f[N][1005],bit[6],pos;
 7 inline bool check(int x) {
 8     int tmp=0x3f;
 9     for(int i=1; i<=m; ++i) {
10         if(tmp==x%3)return false;
11         tmp=x%3,x/=3;
12     }
13     return true;
14 }
15 inline int read() {
16     int ans=0;
17     char ch=getchar();
18     while(!isdigit(ch))ch=getchar();
19     while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
20     return ans;
21 }
22 inline bool judge(int a,int b) {
23     for(int i=1; i<=m; ++i) {
24         if(a%3==b%3)return false;
25         a/=3,b/=3;
26     }
27     return true;
28 }
29 int main() {
30     n=read(),m=read(),K=read(),stat=1;
31     for(int i=1; i<=m; ++i)stat*=3;
32     for(int i=0; i<stat; ++i)if(check(i))sta[++tot]=i;
33     for(int i=1; i<=m; ++i)ban=ban*3+read()-1;
34     for(int i=1; i<=tot; ++i)if(ban==sta[i]) {
35         pos=i;
36         break;
37     }
38     if(!pos) {
39         puts("0");
40         return 0;
41     }
42     for(int i=1; i<=n; ++i) {
43         if(i==K) {
44             if(i==1)f[i][pos]=1;
45             else for(int j=1; j<=tot; ++j)if(judge(sta[pos],sta[j]))
46                 (f[i][pos]+=f[i-1][j])%=mod;
47         } 
48         else 
49             for(int j=1; j<=tot; ++j) {
50                 if(i==1) f[i][j]=1;
51                 else for(int k=1; k<=tot; ++k) 
52                     if(judge(sta[j],sta[k]))
53                         (f[i][j]+=f[i-1][k])%=mod;
54             }
55     }
56     for(int i=1;i<=tot;++i)(ans+=f[n][i])%=mod;
57     cout<<ans;
58     return 0;
59 }
AC Code

免责声明:文章转载自《【LOJ#10172】涂抹果酱》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇使用Jacob与Word文件交互java线程占多大的内存,占哪里的内存?下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

AirtestIDE基本功能(二)

文件菜单-相应工具栏上的前四个按钮:新建、打开、保存和另存为新。单击此按钮以选择是否使用创建脚本。air后缀或带有的脚本。py后缀。新脚本将初始化代码,以帮助您从API引入Airtest的各种接口,并自动初始化设备。你可以看到。air脚本文件实际上是一个公用文件夹,其中放置了通过IDE捕获的图像和运行日志。软件关闭时,布局信息将自动保存。(3) 选项-设置设...

开源项目推荐:Qt有关的GitHub/Gitee开源项目

https://www.froglogic.com/windeployqthttps://doc.qt.io/Qt-5/windows部署。htmlhttps://wiki.qt.io/Deploy_an_Application_on_Windowshttps://github.com/lucasg/Dependencieshttp://www.depend...

layui table 打印表格

例如,layui的表单打印方法是将表单的数据重新组合成新页面,但它只能打印当前页面的内容。仅仅说实话是不够的。我整个上午都找到了一些,并说他们自己换了,但他们并不满意。这没用。我只能打印当前页面的内容。我的想法是编写一个函数,传递显示的列和要打印的数据,然后直接打印。不要胡说八道。直接转到代码。...

选包

安装系统后,将不会安装一些基本工具。此时,您可以根据yum的要求安装它们。你也可以使用任何你想要的时尚。...

C# Task详解

1.任务线程池的优点与线程相比有很多优点,但线程池不方便使用。例如:◆ ThreadPool不支持线程取消、完成和失败通知等交互操作;◆ ThreadPool不支持线程执行顺序;在过去,如果开发人员想要实现上述功能,他们需要完成大量额外的工作。现在,FCL提供了一个更强大的概念:任务。任务基于线程池执行...