fork download
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int f[105][305][10][10];
  4. int a[105];
  5. int n,lt[4];
  6. int val[8]={0,1,1,2,1,2,2,3};
  7. void nhap()
  8. {
  9. freopen("vknights.inp","r",stdin);
  10. freopen("vknights.out","w",stdout);
  11. scanf("%d",&n);
  12. for (int i=1;i<=n;i++) scanf("%d ",&a[i]);
  13. lt[0]=1;
  14. for (int i=1;i<=3;i++) lt[i]=lt[i-1]*2;
  15. }
  16. bool get(int x,int k) //////// getbit(x, k - 1)
  17. {
  18. return (x^lt[k-1])<x;
  19. }
  20. bool check(int x,int k)
  21. {
  22. if (k==0) return false;
  23. return (x^lt[k-1])<x;
  24. }
  25. bool check1(int x,int y)
  26. {
  27. if (get(x,1)==1&&get(x,1)==get(y,3)) return false;
  28. if (get(x,3)==1&&get(x,3)==get(y,1)) return false;
  29. return true;
  30. }
  31. bool check2(int x,int y)
  32. {
  33. if (get(x,1)==1&&get(x,1)==get(y,2)) return false;
  34. if (get(x,2)==1&&get(x,2)==get(y,3)) return false;
  35. if (get(x,2)==1&&get(x,2)==get(y,1)) return false;
  36. if (get(x,3)==1&&get(x,3)==get(y,2)) return false;
  37. return true;
  38. }
  39. void xuli()
  40. {
  41. for (int s=0;s<=7;s++)
  42. if (!check(s,a[1])) f[1][val[s]][s][0]=1;
  43. for (int i=2;i<=n;i++)
  44. for (int j=1;j<=3*n;j++)
  45. for (int s=0;s<=7;s++)
  46. for (int p=0;p<=7;p++)
  47. {
  48. if (!check(s,a[i])&&!check(p,a[i-1])&&check1(s,p))
  49. {
  50. int dem=val[s];
  51. if (j<dem) continue;
  52. for (int q=0;q<=7;q++)
  53. if (check2(q,s)&&!check(q,a[i-2])&&check1(q,p))
  54. {
  55. f[i][j][s][p]+=f[i-1][j-dem][p][q];
  56. }
  57. }
  58. }
  59. int mx=0;
  60. for (int i=1;i<=3*n;i++)
  61. for (int s=0;s<=7;s++)
  62. for (int p=0;p<=7;p++) if (f[n][i][s][p]>0) mx=max(mx,i);
  63. int res=0;
  64. for (int s=0;s<=7;s++)
  65. for (int p=0;p<=7;p++) res+=f[n][mx][s][p];
  66. cout<<mx<<' '<<res;
  67. }
  68. int main()
  69. {
  70. nhap();
  71. xuli();
  72. }
  73.  
Success #stdin #stdout 0.01s 5272KB
stdin
Standard input is empty
stdout
Standard output is empty