UR11 A.元旦老人与汉诺塔
2016-01-02 01:04
232 查看
题目:http://uoj.ac/contest/23/problem/167
如果我们拿个map来存状态的话。设当前状态是v,下一个状态是s。有f[i+1][s]+=f[i][v]。 初始f[0][S]=1
答案就是∑f[i][T]
(说起来只要用了map这题也就不难啊TAT。。。
如果我们拿个map来存状态的话。设当前状态是v,下一个状态是s。有f[i+1][s]+=f[i][v]。 初始f[0][S]=1
答案就是∑f[i][T]
(说起来只要用了map这题也就不难啊TAT。。。
#include<string> #include<iostream> #include<algorithm> #include<cstdio> #include<queue> #include<map> #include<vector> #define rep(i,l,r) for (int i=l;i<=r;i++) #define down(i,l,r) for (int i=l;i>=r;i--) #define clr(x,y) memset(x,y,sizeof(x)) #define ll long long #define maxn 109 #define mm 998244353 using namespace std; vector<int> v; int n,m,S[maxn],T[maxn],ans; map<vector<int>,int> F[maxn]; int read(){ int x=0,f=1; char ch=getchar(); while (!isdigit(ch)){if (ch=='-') f=-1; ch=getchar();} while (isdigit(ch)){x=x*10+ch-'0'; ch=getchar();} return x*f; } void up(int &x){ if (x>mm) x-=mm; } int main(){ n=read(); m=read(); rep(i,1,n) S[i]=read(); rep(i,1,n) T[i]=read(); v.clear(); rep(i,1,n) v.push_back(S[i]); F[0][v]=1; rep(i,0,m-1){ for (map<vector<int>,int>::iterator it=F[i].begin();it!=F[i].end();it++){ v=it->first; int s[4]={n+1,n+1,n+1,n+1}; down(k,n,1) s[v[k-1]]=k; rep(A,1,3) if (s[A]!=n+1){ rep(B,1,3) if (s[A]<s[B]){ v[s[A]-1]=B; up(F[i+1][v]+=it->second); v[s[A]-1]=A; } } } } v.clear(); rep(i,1,n) v.push_back(T[i]); ans=0; rep(i,0,m) up(ans+=F[i][v]); printf("%d\n",ans); return 0; }
相关文章推荐
- 一个表单的多按钮提交
- 基本的ATPCS规则
- UI中如何用纯代码的方式来实现一个图片轮播器
- POJ 3262 Protecting the Flowers(贪心,需要小小优化一下)
- 相关进程间实现互斥的几种方式
- document.form.command.value
- 在亚马逊aws虚拟机更新系统内核
- Xcode7.2如何新建一个空工程
- Redis学习笔记四:独立功能之发布与订阅
- 【转】说下lua使用场景
- 17岁少女王凯歆的创业故事:要做最大的青少年电商平台
- Linux文本处理三剑客之grep和sed
- ARM汇编子程序参数传递
- 数字信号处理笔记
- 数字信号处理笔记
- 了解 Maven
- 方法与思想高于平台与语言
- nginx_lua vs nginx+php 应用场景
- 设计模式系列7---金点子多多的策略模式
- 第六届福建省大学生程序设计竞赛 Super Mobile Charger