您的位置:首页 > Web前端

poj 1037 A decorative fence dp+序列构造

2016-04-26 17:53 323 查看
//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
[i][j];
if(m<=0){
m+=dp
[i][j];
vis[i]=true;
printf("%d",i);
if(j==0)
left=1,right=i-1;
else
left=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;
else
left=i+1,right=n;
j^=1;
break;
}

}
}
puts("");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj 算法