题目链接: http://poj.org/problem?id=1037

分析: 很有分量的一道DP题!!!

(参考于:http://blog.csdn.net/sj13051180/article/details/6669737 )

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <string>
#include <cstring>
#include <algorithm>
#include <iomanip>
using namespace std; long long up[25][25];
long long down[25][25];
long long ans[25]; void getfirst(long long n,long long c,bool u){
if(n==0) return ;
long long sum=0,t;
if(!u) { //前一步是up,当前步要down
t=ans[n+1];
while(sum+down[n][t]<c)
sum+=down[n][t++];
} else { //前一步是down,当前步要up
t=1;
while(sum+up[n][t]<c)
sum+=up[n][t++];
}
ans[n]=t; //定位
getfirst(n-1,c-sum,!u); //搜索下一位
for(int i=1;i<n;++i)
if(ans[i]>=t) ++ans[i];
} void Init(){
up[1][1]=down[1][1]=1;
for(int i=2; i<=20; ++i)
for(int j=1; j<=i; ++j) {
up[i][j]=down[i][j]=0;
for(int k=j; k<=i-1; ++k)
up[i][j]+=down[i-1][k];
for(int k=1; k<=j-1; ++k)
down[i][j]+=up[i-1][k];
}
}
int main(){
Init();
int T; scanf("%d",&T);
while(T--){
long long c,n;
scanf("%lld%lld",&n,&c); long long sum=0,t=1;
while(sum+up[n][t]+down[n][t]<c){
sum+=up[n][t]+down[n][t];
++t;
}
ans[n]=t; //定位首位
//搜索下一位
if(sum+down[n][t]<c) //在up中
getfirst(n-1,c-sum-down[n][t],false);
else //在down中
getfirst(n-1,c-sum,true);
for(int i=1;i<n;++i)// 比如当n=5时, 第一个选了t=3, 还有1,2,4,5 后面会对应到1,2,3,4, 大于t的都相对-1, 最终要+1
if(ans[i]>=t) ++ans[i]; printf("%lld",ans[n]);
for(int i=n-1;i>=1;--i)
printf(" %lld",ans[i]);
puts("");
}
return 0;
}

POJ 1037 DP的更多相关文章

  1. POJ 1037 (计数 + DP) 一个美妙的栅栏

    这道题总算勉勉强强看懂了,DP和计数都很不好想 DP部分: 称i根木棒的合法方案集合为S(i),第二根木棒比第一根长的方案称作UP方案,反之叫做DOWN方案 C[i][k][DOWN] 是S(i)中以 ...

  2. poj 1037 三维dp

    A decorative fence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7221   Accepted: 272 ...

  3. hdu 1513 && 1159 poj Palindrome (dp, 滚动数组, LCS)

    题目 以前做过的一道题, 今天又加了一种方法 整理了一下..... 题意:给出一个字符串,问要将这个字符串变成回文串要添加最少几个字符. 方法一: 将该字符串与其反转求一次LCS,然后所求就是n减去 ...

  4. poj 1080 dp如同LCS问题

    题目链接:http://poj.org/problem?id=1080 #include<cstdio> #include<cstring> #include<algor ...

  5. poj 1609 dp

    题目链接:http://poj.org/problem?id=1609 #include <cstdio> #include <cstring> #include <io ...

  6. poj 1037 A decorative fence

    题目链接:http://poj.org/problem?id=1037 Description Richard just finished building his new house. Now th ...

  7. Jury Compromise POJ - 1015 dp (标答有误)背包思想

    题意:从 n个人里面找到m个人  每个人有两个值  d   p     满足在abs(sum(d)-sum(p)) 最小的前提下sum(d)+sum(p)最大 思路:dp[i][j]  i个人中  和 ...

  8. poj 1485 dp

    转自:http://www.cnblogs.com/kuangbin/archive/2011/11/12/2246407.html [题目大意] 一条公路上有n个旅馆,选出其中k个设置仓库,一个仓库 ...

  9. POJ 3017 DP + 单调队列 + 堆

    题意:给你一个长度为n的数列,你需要把这个数列分成几段,每段的和不超过m,问各段的最大值之和的最小值是多少? 思路:dp方程如下:设dp[i]为把前i个数分成合法的若干段最大值的最小值是多少.dp转移 ...

随机推荐

  1. QT中代码中与设计器中控件信号与SLOT连接(原来还可以这样连接)

    双击testqt.ui 托一个push button到窗体中,双击,可以输入字符 按F4或 menu->edit->edit signals/slots 定义SLOT 选择已定义好的SLO ...

  2. 使用TWebBrowser组件保存网页为html和mht文件 收藏

    一.保存为HTML文件 uses ActiveX;...procedure WB_SaveAs_HTML(WB : TWebBrowser; const FileName : string) ;var ...

  3. gdb运行时结合汇编堆栈分析

    一.从源代码文件到可执行文件         从C文件到可执行文件,一般来说需要两步,先将每个C文件编译成.o文件,再把多个.o文件和链接库一起链接成可执行文件.但具体来说,其实是分为四步,下面以ex ...

  4. 在.NET中快速创建一个5GB、10GB或更大的空文件

    对于通过UDP进行打文件传输的朋友应该首先会考虑到一个问题,那就是由于UDP并不会根据先来先到原则进行发送,也许你发送端发送的时候是以包1和包2的顺序传输的,但接收端可能以包2和包1 的顺序来进行接收 ...

  5. SurfaceView 和 View 区别

    android.view.View 和 android.view.SurfaceView SurfaceView 是从 View 基类中派生出来的显示类,直接子类有 GLSurfaceView和Vid ...

  6. [置顶] PHP如何扩展和如何在linux底层对php扩展?

    虽然大部分php工程师都不需要知道php的C代码核心是如何运作的,有些人可能知道有个dl()函数.或者使用过一些第三方的类库,这些正是本文的重点之一.            希望对那些想把php带向更 ...

  7. CSS-DOM介绍

    三位一体的网页: 我们在浏览器里看到的网页其实是由以下三层信息构成的一个共同体: 1.结构层: 结构层是由HTML和XHTML之类的标记语言所构成的.所就是哪些出现在html标签里面的单词,对网页内容 ...

  8. SQL SERVER2012新分页方式 轉載

    SQL SERVER2012在ORDER BY 子句中加入了新元素offset,允许用户在排序完成的结果集中自定义输出行范围,大大简化了分页SQL的书写方式和效率. SQL SERVER2012在OR ...

  9. Linux远程自动输入密码抓取远程资源

    #!/usr/bin/expect -fset timeout 3000set sys_date [lindex $argv 0] #要抓取的文件日期spawn scp /data3/xiaorui/ ...

  10. prime算法求最小生成树(畅通工程再续)

    连着做了四道畅通工程的题,其实都是一个套路,转化为可以求最小生成树的形式求最小生成树即可 这道题需要注意: 1:因为满足路的长度在10到1000之间才能建路,所以不满足条件的路径长度可以初始化为无穷 ...