Codeforces Beta Round #14 (Div. 2) E. Camels

来源:互联网 发布:淘宝旺旺号怎么查看 编辑:程序博客网 时间:2024/05/20 16:13

dp[i][j][k][l][m]填了i位,有j个极大值点,k个极小值点,倒数第二位是数字l,倒数第一位是数字m,有多少种填法。转移的时候枚举最后一位填什么就可以了。

#include <bits/stdc++.h>using namespace std;__int64 dp[25][15][15][4][4];int n,t;int main(){scanf("%d%d",&n,&t);for(int i=0;i<4;i++)for(int j=0;j<4;j++){dp[2][0][0][i][j]=(i!=j);}for(int i=2;i<n;i++){for(int j=0;j<=i/2;j++){for(int k=0;k<=i/2;k++){for(int x=0;x<4;x++){for(int y=0;y<4;y++){if(dp[i][j][k][x][y]==0)continue;__int64 now=dp[i][j][k][x][y];for(int z=0;z<4;z++){if(z==y)continue;if(x<y){if(z<y)dp[i+1][j+1][k][y][z]+=now;elsedp[i+1][j][k][y][z]+=now;}else{if(z>y)dp[i+1][j][k+1][y][z]+=now;elsedp[i+1][j][k][y][z]+=now;}}}}}}}__int64 ans=0;for(int i=0;i<4;i++){for(int j=0;j<4;j++){ans+=dp[n][t][t-1][i][j];}}printf("%I64d\n",ans);//system("pause");return 0;}


0 0
原创粉丝点击