poj 1037 DP 求波浪序列中按字典序排列的第k个序列

来源:互联网 发布:java swing 布局 编辑:程序博客网 时间:2024/06/05 18:17
#include<cstdio>#include<cstring>long long int dp[25][25][2];int put[36];int vis[36];void init(){dp[1][1][0]=1;dp[1][1][1]=1;for(int i=2;i<=20;i++)for(int j=1;j<=i;j++){for(int k=1;k<j;k++)dp[i][j][1]+=dp[i-1][k][0];for(int k=j;k<i;k++)dp[i][j][0]+=dp[i-1][k][1];}}int main(){int T;init();scanf("%d",&T);while(T--){long long int n,aim;scanf("%lld%lld",&n,&aim);long long t1=0,t2;        memset(vis,0,sizeof(vis));        for(int i=1;i<=n;i++)        {        int no=0,k;        for(k=1;k<=n;k++)        {        t2=t1;        if(!vis[k])        {        no++;        if(i==1)        t1+=dp[n][no][0]+dp[n][no][1];        else if(k>put[i-1]&&(i==2||put[i-2]>put[i-1]))        t1+=dp[n-i+1][no][1];        else if(k<put[i-1]&&(i==2||put[i-2]<put[i-1]))        t1+=dp[n-i+1][no][0];        if(t1>=aim)        break;}}vis[k]=1;put[i]=k;printf("%d ",k);t1=t2;}printf("\n");}}

0 0
原创粉丝点击