题目: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。。。
#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; }