题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=4713

题目大意:

题意同HDU 3092这不过这题要输出路径。

解题思路:

思路同HDU 3092

因为n比较大,不能开二维只记录前面一个来 逆着存路径。

所以对于每个状态,把到达它的所有数都保存下来。转移的时候将前面的路径也赋值过来。

dp[i]表示表示不超过i的能分成的最大的最小公倍数的对数。少了的话用1来凑。

注意:输出的时候值小的在前面,+1成环输出。

代码:

  1. #include<iostream>
  2. #include<cmath>
  3. #include<cstdio>
  4. #include<cstdlib>
  5. #include<string>
  6. #include<cstring>
  7. #include<algorithm>
  8. #include<vector>
  9. #include<map>
  10. #include<set>
  11. #include<stack>
  12. #include<list>
  13. #include<queue>
  14. #define eps 1e-6
  15. #define INF 0x3fffffff
  16. #define PI acos(-1.0)
  17. #define ll __int64
  18. #define lson l,m,(rt<<1)
  19. #define rson m+1,r,(rt<<1)|1
  20. #pragma comment(linker, "/STACK:1024000000,1024000000")
  21. using namespace std;
  22.  
  23. #define Maxn 10000 //三千内的质数430个
  24.  
  25. double dp[Maxn+10]; //取对数保证最小公倍数不会溢出
  26. //dp[i]表示i能分成的最大的最小公倍数的对数
  27. bool tmp[Maxn+10];
  28. int pp[Maxn+10],ans[Maxn+10];
  29. vector<int>myv[Maxn+10];
  30.  
  31. int n,cnt;
  32.  
  33. void init()
  34. {
  35. cnt=0;
  36. memset(tmp,false,sizeof(tmp));
  37. for(int i=2;i<=Maxn;i++) //素数晒选法
  38. {
  39. if(!tmp[i])
  40. {
  41. pp[++cnt]=i;
  42. for(int j=i*2;j<=Maxn;j+=i)
  43. tmp[j]=true;
  44. }
  45. }
  46. return ;
  47. }
  48.  
  49. void solve()
  50. {
  51. memset(dp,0,sizeof(dp));
  52. for(int i=0;i<=n;i++)
  53. myv[i].clear();
  54. for(int i=1;i<=cnt&&pp[i]<=n;i++)
  55. {
  56. double tt=log10(pp[i]*1.0);
  57. for(int j=n;j>=pp[i];j--) //相同质数应做为一个整体考虑
  58. {
  59. for(int k=pp[i],num=1;k<=j;k=k*pp[i],num++)
  60. if(dp[j-k]+tt*num>dp[j])
  61. {
  62. dp[j]=dp[j-k]+tt*num;
  63. myv[j]=myv[j-k];
  64. myv[j].push_back(k);
  65. }
  66. }
  67. }
  68. }
  69.  
  70. int main()
  71. {
  72. init();
  73. //printf("%d\n",cnt);
  74. int t;
  75. scanf("%d",&t);
  76. while(t--)
  77. {
  78. scanf("%d",&n);
  79. solve();
  80. int t=myv[n].size();
  81. int sum=0;
  82.  
  83. for(int i=0;i<t;i++)
  84. sum+=myv[n][i];
  85. sum=n-sum;
  86. while(sum--)
  87. myv[n].push_back(1);
  88. sort(myv[n].begin(),myv[n].end());
  89. int s=0;
  90. for(int i=0;i<myv[n].size();i++)
  91. {
  92. for(int j=1;j<myv[n][i];j++)
  93. printf("%d ",s+j+1);
  94. printf("%d",s+1);
  95. if(i!=myv[n].size()-1)
  96. putchar(' ');
  97. s+=myv[n][i];
  98. }
  99. putchar('\n');
  100. }
  101.  
  102. return 0;
  103. }

记录路径dp-4713-Permutation的更多相关文章

  1. hdu1074 状压DP、栈实现记录路径

    题意:给了几门学科作业.它们的截止提交期限(天数).它们的需要完成的时间(天数),每项作业在截止日期后每拖延一天扣一学分,算最少扣的学分和其完成顺序. 一开始做的时候,只是听说过状态压缩这个神奇的东西 ...

  2. hdu 1074(状态压缩dp+记录路径)

    题意:给了n个家庭作业,然后给了每个家庭作业的完成期限和花费的实践,如果完成时间超过了期限,那么就要扣除分数,然后让你找出一个最优方案使扣除的分数最少,当存在多种方案时,输出字典序最小的那种,因为题意 ...

  3. PAT L3-001 凑零钱(01背包dp记录路径)

    韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债.韩梅梅手边有104枚来自各个星球的硬币,需要请你帮她盘算一下,是 ...

  4. Codeforces Round #436 (Div. 2) E. Fire(dp 记录路径)

    E. Fire time limit per test 2 seconds memory limit per test 256 megabytes input standard input outpu ...

  5. poj1417 带权并查集 + 背包 + 记录路径

    True Liars Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2713   Accepted: 868 Descrip ...

  6. E - Coin Change UVA - 674 &&(一些记录路径的方法)

    这一道题并不难,我们只需要将dp数组先清空,再给dp[0]=1,之后就按照完全背包的模板写 主要是我们要证明着一种方法不会出现把(1+3+4)(1+4+3)当作两种方法,这一点如果自己写过背包的那个表 ...

  7. UVA 624(01背包记录路径)

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  8. POJ 1015 Jury Compromise (记录路径的背包问题)

    (点击此处查看原题) 题意 为了审判某一个人,需要在n个人当中选出m个人组成陪审团,n个人中每个人都有作为起诉方的价值p和作为辩护方的价值d,为了保证公平性,要求m个人作为起诉方的价值之和P和作为辩护 ...

  9. F - LCS 题解(最长公共子序列记录路径)

    题目链接 题目大意 给你两个字符串,任意写出一个最长公共子序列 字符串长度小于3e3 题目思路 就是一个记录路径有一点要注意 找了好久的bug 不能直接\(dp[i][j]=dp[i-1][j-1]+ ...

  10. 01背包记录路径 (例题 L3-001 凑零钱 (30分))

    题意: 就是找出来一个字典序最小的硬币集合,且这个硬币集合里面所有硬币的值的和等于题目中的M 题解: 01背包加一下记录路径,如果1硬币不止一个,那我们也不采用多重背包的方式,把每一个1硬币当成一个独 ...

随机推荐

  1. 2014 HDU多校弟六场J题 【模拟斗地主】

    这是一道5Y的题目 有坑的地方我已在代码中注释好了 QAQ Ps:模拟题还是练的太少了,速度不够快诶 //#pragma comment(linker, "/STACK:16777216&q ...

  2. ios 判断,qq,银行卡,手机号,邮编,生日,数字,字符串,护照, email

    http://blog.csdn.net/dyllove98/article/details/8635079 IdentifierValidator.h // //  IdentifierValida ...

  3. Linux下查看二进制文件命令

    一.在Linux下查看二进制文件的软件: xxd hexdump 二.编辑: 1.biew 2.hexedit 3.vim Vim 来编辑二进制文件.Vim 本非为此而设计的,因而有若干局限.但你能读 ...

  4. 基于visual Studio2013解决C语言竞赛题之0516人来人往

     题目

  5. Dockerfile指令总结

    指令的一般格式为INSTRUCTION arguments,指令包含FROM.MAINTAINER.RUN等. FROM 格式为FROM <image>或FROM <image> ...

  6. javascript每日一练(十四)——弹性运动

    一.弹性运动 运动原理:加速运动+减速运动+摩擦运动: <!doctype html> <html> <head> <meta charset="u ...

  7. 15-UIKit(view布局、Autoresizing)

    目录: 1. 纯代码布局 2. 在View中进行代码布局 3. Autoresizing 回到顶部 1. 纯代码布局 纯代码布局分VC下和V下 [MX1-layout-code] 在VC下覆盖view ...

  8. Qt核心剖析:信息隐藏(三篇)

    http://devbean.blog.51cto.com/448512/335550 http://devbean.blog.51cto.com/448512/325581 http://devbe ...

  9. docker学习笔记4:利用docker hub上的mysql镜像创建mysql容器

    docker hub上有官方的mysql镜像,我们可以利用它来创建mysql容器,作为一个服务容器使用. 1.下载mysql镜像 docker pull mysql 2.创建镜像 docker run ...

  10. cocos2d-x2.0 win7第一次创建项目需要调用到的脚本(不断更新维护)//cocos2d-x 教程一

    第一步: 最新的cocos2d-x.下载地址https://github.com/cocos2d/cocos2d-x github上最新的引擎,值得注意的是官网上发布的引擎是稳定版.选择哪种就看个人喜 ...