涂抹果酱(状压dp)
涂抹果酱
题目描述
现在Sam想知道:能令Admin满意的涂果酱方案有多少种。请输出方案数 mod10^6。若不存在满足条件的方案,请输出0。
输入描述:
输入共三行。第一行:N,M;第二行:K;第三行:M个整数,表示第K行的方案。字母的详细含义见题目描述,其他参见样例。
输出描述:
输出仅一行,为可行的方案总数。
输入
2 2 1 2 3
输出
3
说明
备注:
对于30%的数据,1≤N×M≤20;对于60%的数据,1≤N≤1000,1≤M≤3;对于100%的数据,1≤N≤10000,1≤M≤5。 题目思路:因为有三种果酱,所以考虑三进制状压dp,首先初始化三进制的合法状态(相邻的不能一样),用一个vector保存f[i][j]表示第i行状态为[v[j]]时前i行的方案数,judge用来判断上下两行是否合法,index代表第k行状态在vector中的下标。因为第k行已经固定,所以要分为两个阶段,第一阶段为k行以上的方案数,第二阶段为k行以下的方案数,注意第一阶段结束后f[k][index]要重新归1。最后的答案就是两个阶段相乘的方案数取模 代码如下:
#include<bits/stdc++.h> #define ll long long #define mod 1000000 using namespace std; ll n,m,k,a[6],f[10010][100],mode,ans1,ans2; vector<ll> v; void init(int x,int y)//初始化合法状态 {if(x==m){v.push_back(y);return ;}else if(x==0){init(1,0),init(1,1),init(1,2);return ;}if((int)(y/pow(3,x-1))%3==0)init(x+1,y+1*pow(3,x)),init(x+1,y+2*pow(3,x));else if((int)(y/pow(3,x-1))%3==1)init(x+1,y+0*pow(3,x)),init(x+1,y+2*pow(3,x));elseinit(x+1,y+0*pow(3,x)),init(x+1,y+1*pow(3,x)); } bool judge(int x,int y)//判断x状态和y状态分别为上下两行时是否合法 {int wei = m;while(wei--){int a = x%3,b = y%3;if(a==b)return false;x/=3,y/=3;}return true; } int main() {cin>>n>>m>>k;for(int i = 0;i<m;i++){cin>>a[i];mode+=pow(3,m-1-i)*(a[i]-1);//mode记录第k行状态 } init(0,0);int index = find(v.begin(),v.end(),mode)-v.begin();if(index==v.size())//如果第k行的状态不合法 {cout<<0;return 0;} if(k==1)//如果k为1,那么第一阶段方案数为1 {ans1 = 1;f[k][index] = 1;} if(k!=1){for(int i = 0;i<v.size();i++)f[1][i] = 1;} for(int i = 2;i<=n;i++){if(i==k){for(int l = 0;l<v.size();l++){if(judge(mode,v[l])){f[i][index]+=f[i-1][l];f[i][index]%=mod;}}ans1 = f[i][index]%mod;f[i][index] = 1;continue;}for(int j = 0;j<v.size();j++){for(int l = 0;l<v.size();l++){if(judge(v[j],v[l])&&f[i-1][l]){f[i][j]+=f[i-1][l];f[i][j]%=mod;}}}}for(int j = 0;j<v.size();j++)ans2 = (ans2+f[n][j])%mod;cout<<(ans1*ans2)%mod;return 0; }
如果有错误的地方,还请各位大佬指正。
转载于:https://www.cnblogs.com/loganacmer/p/11296808.html
涂抹果酱(状压dp)相关推荐
- 涂抹果酱(三进制状压dp)
涂抹果酱(状压dp) 题目描述 输入描述: 输出描述: 示例 输入 输出 说明 备注: 题目思路: 代码 欢迎关注微信公众号:Java后台开发 题目描述 Tyvj两周年庆典要到了,Sam想为Tyvj做 ...
- POJ 1038 Bugs Integrated Inc (复杂的状压DP)
\(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...
- codeforces 8C. Looking for Order 状压dp
题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...
- UVA10296 Jogging Trails(中国邮递员问题)(欧拉回路、一般图最大权匹配 / 状压DP)
整理的算法模板合集: ACM模板 目录 思路 UVA10296 Jogging Trails 题目翻译: 给你n个点,m条无向边,每条边有一定的距离数值,构造成一个连通图.问从任意一点出发,遍历所有的 ...
- POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)
poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...
- 【每日DP】day2、P1879 [USACO06NOV]Corn Fields G玉米地(状压DP模板题)难度⭐⭐⭐★
昨天的每日DP我还在写01背包,今天就到状压DP了,真刺激. P1879 [USACO06NOV]Corn Fields G 题目链接 输入 2 3 1 1 1 0 1 0 输出 9 一道简单的状压D ...
- hdu 4778 Gems Fight! 状压dp
转自wdd :http://blog.csdn.net/u010535824/article/details/38540835 题目链接:hdu 4778 状压DP 用DP[i]表示从i状态选到结束得 ...
- 【洛谷 P1896】[SCOI2005]互不侵犯(状压dp)
题目链接 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 这是道状压\(DP\)好题啊.. ...
- P2340 奶牛会展(状压dp)
P2340 奶牛会展 题目背景 奶牛想证明它们是聪明而风趣的.为此,贝西筹备了一个奶牛博览会,她已经对N 头奶牛进行 了面试,确定了每头奶牛的智商和情商. 题目描述 贝西有权选择让哪些奶牛参加展览.由 ...
- UVa 11825 (状压DP) Hackers' Crackdown
这是我做状压DP的第一道题,状压里面都是用位运算来完成的,只要耐下心来弄明白每次位运算的含义,还是容易理解的. 题意: 有编号为0~n-1的n台服务器,每台都运行着n中服务,每台服务器还和若干台其他服 ...
最新文章
- PyTorch 源码解读之分布式训练了解一下?
- 深入理解学习Git工作流
- jQuery样式操作
- Mac OS X 10.9.3 Beta 8升级教程
- ajax 参数大小限制,Ajax中的POST数据大小是否有限制?
- 4.有关日期格式属性修改常识,v$nls_parameters,between and,查询指定部门的员工信息,in和null,like模糊查询,order by后面可以跟:列名、表达式、别名、序号
- 【概率DP】$P2059$ 卡牌游戏
- 云原生领域首本架构白皮书,你Get到了吗?
- 自测-2 素数对猜想
- spark 通过打散热点key解决数据倾斜问题
- MySQL常用函数大全(总结篇)
- 环洋市场调研-2022年全球一次性餐具市场总体规模及应用细分研究报告
- 统计学练习题——组合,排列组合
- 比较好的文档翻译软件-哪个翻译软件最精准
- Cool Edit Pro 2.0 Resample.xfm
- [06.21] LinkLabel 代码重构和我的SinaWeibo7 Project Todolist
- 走访最没存在感的省份之一,经济仍有潜力
- 如何选择适合你的兴趣爱好(三十三),国画
- 一步一步学做一个CPU——3,用QuartusII通过原理图完成与门电路设计
- Linux Centos7目录结构总结