Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
W型M型是神马>_<……就是一个排列位DP一般的位DP是数位,这个是排列位DP,位DP之后判解的字典序,经典问题…… 具体看代码吧……: #include<cstdio> #include<cstring> long long dp[2][25][25],tdp[2][25][25]; int f[25]; int main() { dp[0][1][1]=dp[1][1][1]=1; for(int i=2;i<=20;i++) { for(int j=1;j<=i-1;j++) dp[i&1][i][j+1]=dp[i&1][i][j]+dp[i&1][i-1][j]; for(int j=i-1;j>=0;j--) dp[~i&1][i][j]=dp[~i&1][i][j+1]+dp[~i&1][i-1][j]; } int t; scanf("%d",&t); while(t--) { int n; long long k; scanf("%d%lld",&n,&k); memcpy(tdp,dp,sizeof(dp)); int fl[2]={1,1}; for(int i=n;i>=1;i--) { int j; for(j=1;k-dp[0][i][j]-dp[1][i][j]>0;j++) k-=dp[0][i][j]+dp[1][i][j]; f[i]=j; if (!dp[0][i][j]) fl[0]=0; if (!dp[1][i][j]) fl[1]=0; for(j=f[i];j<=i-1;j++) dp[i&1][i-1][j]=0; for(j=1;j<=f[i]-1;j++) dp[~i&1][i-1][j]=0; if (!fl[0]) for(int j=1;j<=i-1;j++) dp[0][i-1][j]=0; if (!fl[1]) for(int j=1;j<=i-1;j++) dp[1][i-1][j]=0; } memcpy(dp,tdp,sizeof(dp)); for(int i=2;i<=n;i++) for(int j=i-1;j>=1;j--) if (f[i]<=f[j]) f[j]++; printf("%d",f[n]); for(int i=n-1;i>=1;i--) printf(" %d",f[i]); puts(""); } } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator