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; }
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析