题目链接: 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,当前步要downt=ans[n+1];while(sum+down[n][t]<c)sum+=down[n][t++];} else { //前一步是down,当前步要upt=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 3017 DP + 单调队列 + 堆

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

  2. POJ 1159 (DP)

    题目:http://poj.org/problem?id=1159 思路: 找出原串的最长回文子串,当然这里说的回文子串可以不连续.用原串的长度减去最长回文子串的长度即可得出结果. 设原串a[5001 ...

  3. POJ 1661 DP

    Help Jimmy Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11071   Accepted: 3607 Descr ...

  4. POJ 3666 dp

    题意 传送门 POJ 3666 基本思路是对 N 个位置枚举所有可能高度,并 dp 求最大值.可能高度取 N 个位置的高度即可,排序以方便顺序 dp.对于升序的情况 dp[i][j]=max{dp[i ...

  5. POJ 3666(DP)

    题目链接:http://poj.org/problem?id=3666 题目大意:给一个串,要求修改最少使得串满足非递增或非递减 题目思路:刚开始没想到,后来经学长提醒如果串里的数字变1000可以怎么 ...

  6. POJ 3257 DP

    题意: 思路: 用vector存上本出发点能到的地方&成本&有趣指数(用结构体保存) 然后DP就好了 f[i][j]表示到了i 成本为j的有趣指数最大是多少 f[vec[i][k].e ...

  7. poj 2392 dp 不是很懂哎!!!Space Elevator

    大意:有K种block去建塔,每种每个都有一个高度H,用了当前的block塔的高度不能超出a,和每种的数量.求塔最高能建多高. 分析:这题就是一个多重背包,但有一点变动,必须先以a从小到大排序,因为如 ...

  8. poj 2346(DP)

     题意:n位数,满足前n/2个数字之和同后n/2个数字之和相同的数一共有多少个? 解题思路:dp[i][j]表示前i个数的和为j时,有多少个: 递推关系:dp[i][j] += dp[i-1][k ...

  9. POJ 2353 DP

    双向DP+记录路径. // by SiriusRen #include <stack> #include <cstdio> #include <cstring> u ...

最新文章

  1. 游戏脚本和MonoBehaviour生命周期
  2. 这份门禁系统培训PPT也太全面了,门禁系统知识,看这一篇就够了
  3. 总体经济拉动新引擎-农业大健康·张咏:疫情后谋定乡村振兴
  4. contains java_Java CopyOnWriteArraySet contains()用法及代码示例
  5. FreeEIM 是班级的学习委员
  6. 【Kafka】kafka console received unknown topic or partition error listOffset request
  7. 2021鞍山市高考成绩怎么查询,鞍山师范学院
  8. gradle 错误: 编码GBK的不可映射字符
  9. Win10编译和测试libModbus
  10. 新买电脑编译运行dev c++慢的
  11. java毕业设计仓库管理系统Mybatis+系统+数据库+调试部署
  12. 微信小程序 之修改switch组件尺寸大小
  13. 微信小程序wx.getUserInfo获取用户所在地区将拼音转换为中文的方法
  14. Python男票管理系统
  15. 如何获得凤凰网或腾讯视频链接并下载到本地
  16. 我的发明20220723
  17. Git和Gitee的使用(仅分享一下自己成功的过程)
  18. 闰年的判断(python)
  19. Android技术点汇总
  20. qt制作一个画板_Qt 一个简易画板实现(Graphics View).pdf

热门文章

  1. 测试基础-03-用例设计方法:案例讲解
  2. ScheduledExecutorService线程调度的使用
  3. mysql异常插件_【异常】诡异的mysql错误,Pagehelper插件混乱导致吗
  4. JUnit5 测试套件示例
  5. 为什么php都用mysql,PHP MySQL为什么?
  6. python怎么实现黑客攻击英国_注意!你的隐私就是这样被黑客获取的
  7. 程序员:凭什么他大专12K,而我硕士研究生才5K?
  8. 新手如何从零开始入门前端开发,分享我的学习方法!
  9. 商品进销差价_商品进销差价如何核算?
  10. plc tcp ip通讯怎么只能连一个客户端_一款Ethernet/IP和Modbus TCP转OPC UA产品