poj 1037 A decorative fence dp+序列构造

来源:互联网 发布:淘宝所有宝贝链接地址 编辑:程序博客网 时间:2024/05/16 05:36
//poj 1037//sep9#include <iostream>using namespace std;typedef long long ll;ll dp[32][32][2];bool vis[32];int main(){memset(dp,0,sizeof(dp));dp[1][1][0]=dp[1][1][1]=1;for(int len=2;len<=20;++len)for(int i=1;i<=len;++i){for(int j=1;j<i;++j) dp[len][i][0]+=dp[len-1][j][1];for(int j=i;j<len;++j)//注意不是j=i+1;j<=len;++j,因为这种递增情况要除去i的。 dp[len][i][1]+=dp[len-1][j][0];}int cases;scanf("%d",&cases);while(cases--){int n,left,right,j;ll m;bool flag=false;scanf("%d%lld",&n,&m);memset(vis,0,sizeof(vis));for(int i=1;i<=n&&!flag;++i)for(j=0;j<=1;++j){m-=dp[n][i][j];if(m<=0){m+=dp[n][i][j];vis[i]=true;printf("%d",i);if(j==0)left=1,right=i-1;elseleft=i+1,right=n;flag=true;j^=1;break;}}for(int len=n-1;len>=1;--len){int cnt=0;for(int i=1;i<left;++i)if(!vis[i])++cnt;for(int i=left;i<=right;++i)if(!vis[i]){++cnt;m-=dp[len][cnt][j];if(m<=0){m+=dp[len][cnt][j];vis[i]=true;printf(" %d",i);if(j==0)left=1,right=i-1;elseleft=i+1,right=n;j^=1;break;}}}puts("");}return 0;}

0 0
原创粉丝点击