对应POJ题目:点击打开链接
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 1123 | Accepted: 548 |
Description
Input
Output
Sample Input
2 3 -1
Sample Output
2: 0 3: 8
#include<cstdio> #include<cstdlib> #include<cmath> #include<map> #include<queue> #include<stack> #include<vector> #include<algorithm> #include<cstring> #include<string> #include<iostream> const int MAXN=1000+10; using namespace std; long long num[20][5][5][2]; //num[i][j][k][e]; i表示到达第几个slot,j表示有多少种slot,k表示到达的slot的编号是(1,2,3,4),e表示是否存在相连的1和4 int n; long long dfs(int a,int b,int c,int d,int e) { if(a==n){ if(d && b>=3) return 1; else return 0; } if(num[a][b][c][d]!=-1) return num[a][b][c][d]; long long ans=0; for(int i=1; i<=4; i++){ int x=0; if(c==1 && i==4) x=1; else if(c==4 && i==1) x=1; int y; if((1<<(i-1))&e) y=b; else y=b+1; if(y>3) y=3; ans+=dfs(a+1, y, i, d||x, e|(1<<(i-1))); } num[a][b][c][d]=ans; return ans; } int main() { //freopen("in.txt","r",stdin); while(cin>>n, n!=-1) { memset(num,-1,sizeof(num)); long long res=dfs(0,0,0,0,0); cout<<n<<": "<<res<<endl; } return 0; }