洛谷 P2593 [ZJOI2006]超級麻將【dp】
阿新 • • 發佈:2018-09-24
ret ++ 超級 scanf ace () std 表示 class
設f[i][j][k][0/1]表示選到i時,i-1選j張,i選k張,之前選的所有牌是否選擇了對子
然後分情況討論轉移即可
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=105; int n,a[N]; bool f[N][N][N][2]; int main() { scanf("%d",&n); while(n--) { memset(f,0,sizeof(f)); for(int i=1;i<=100;i++) scanf("%d",&a[i]); f[0][0][0][0]=1; for(int i=1;i<=100;i++) for(int j=0;j<=a[i-1];j++) for(int k=0;k<=a[i];k++) { if(k>1) f[i][j][k][1]|=f[i][j][k-2][0]; if(k>2) { f[i][j][k][1]|=f[i][j][k-3][1]; f[i][j][k][0]|=f[i][j][k-3][0]; } if(k>3) { f[i][j][k][1]|=f[i][j][k-4][1]; f[i][j][k][0]|=f[i][j][k-4][0]; } if(j>=k&&a[i-2]>=k) { f[i][j][k][0]|=f[i-1][a[i-2]-k][j-k][0]; f[i][j][k][1]|=f[i-1][a[i-2]-k][j-k][1]; } } if(f[100][a[99]][a[100]][1]) puts("Yes"); else puts("No"); } return 0; }
洛谷 P2593 [ZJOI2006]超級麻將【dp】