POJ 1037 DP
题目链接: 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的更多相关文章
- POJ 1037 (计数 + DP) 一个美妙的栅栏
这道题总算勉勉强强看懂了,DP和计数都很不好想 DP部分: 称i根木棒的合法方案集合为S(i),第二根木棒比第一根长的方案称作UP方案,反之叫做DOWN方案 C[i][k][DOWN] 是S(i)中以 ...
- poj 1037 三维dp
A decorative fence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7221 Accepted: 272 ...
- hdu 1513 && 1159 poj Palindrome (dp, 滚动数组, LCS)
题目 以前做过的一道题, 今天又加了一种方法 整理了一下..... 题意:给出一个字符串,问要将这个字符串变成回文串要添加最少几个字符. 方法一: 将该字符串与其反转求一次LCS,然后所求就是n减去 ...
- poj 1080 dp如同LCS问题
题目链接:http://poj.org/problem?id=1080 #include<cstdio> #include<cstring> #include<algor ...
- poj 1609 dp
题目链接:http://poj.org/problem?id=1609 #include <cstdio> #include <cstring> #include <io ...
- poj 1037 A decorative fence
题目链接:http://poj.org/problem?id=1037 Description Richard just finished building his new house. Now th ...
- Jury Compromise POJ - 1015 dp (标答有误)背包思想
题意:从 n个人里面找到m个人 每个人有两个值 d p 满足在abs(sum(d)-sum(p)) 最小的前提下sum(d)+sum(p)最大 思路:dp[i][j] i个人中 和 ...
- poj 1485 dp
转自:http://www.cnblogs.com/kuangbin/archive/2011/11/12/2246407.html [题目大意] 一条公路上有n个旅馆,选出其中k个设置仓库,一个仓库 ...
- POJ 3017 DP + 单调队列 + 堆
题意:给你一个长度为n的数列,你需要把这个数列分成几段,每段的和不超过m,问各段的最大值之和的最小值是多少? 思路:dp方程如下:设dp[i]为把前i个数分成合法的若干段最大值的最小值是多少.dp转移 ...
随机推荐
- linux下/proc/sysrq-trigger文件的功能
/proc/sysrq-trigger该文件能做些什么事情呢? # 立即重新启动计算机 (Reboots the kernel without first unmounting file system ...
- J2SE知识点摘记(七)
1. 枚举的用法 enum 枚举名{枚举值表标};例子:"enum weekday{sun,mon,tue,wed,fri,sat}a,b,c;" For循环语句中使 ...
- Tempo 2.0
Tempo 2.0 Tempo is an easy, intuitive JavaScript rendering engine that enables you to craft data tem ...
- 組裝工廠設置IQC的目的
在電子組裝工廠的組織裡,一般都會有 IQC (Incoming Quality Control) 這個單位,台灣稱之為「入(進)料管控」,大陸稱之為「來料管控」,其最主要目的在攔檢所有買進材料是否符合 ...
- 强烈推荐visual c++ 2012入门经典适合初学者入门
强烈推荐visual c++ 2012入门经典适合初学者入门 此书循序渐进,用其独特.易于理解的教程风格来介绍各个主题,无论是编程新手,还是经验丰富的编程人员,都很容易理解. 此书的目录基本覆盖了Wi ...
- iphone5升级到iOS7时出现“This device isn't eligible for the requested build”错误
因为工作的需要我需要把自己的手机升级到iOS7,安装苹果的升级顺序总是报This device isn't eligible for the requested build错误,搜索相关的文章我的错误 ...
- nginx File not found 错误分析与解决方法
使用php-fpm解析PHP,出错提示如下:"No input file specified","File not found",原因是php-fpm进程找不到 ...
- python <tab>自动补全
1.获取python目录[我使用的是64位ubuntu系统] [~$]python Python 2.7.3 (default, Apr 10 2013, 06:20:15) [GCC 4.6.3] ...
- 一步一步学android之布局管理器——RelativeLayout
今天开始学习RelativeLayout(相对布局),相对布局在平时布局的时候用的较多,因为Android适配方面的原因.相对布局可以控制组件摆放的位置(放在任一组件的上下左右等位置),下面来看看类的 ...
- Memcached基础
1.实例化 MemcachedClient client = new XMemcachedClient(); public XMemcachedClient() public XMemcachedCl ...