dp+计数 poj-1037-A decorative fence

[递推dp] zoj 3747 Attack on Titans 题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5170 Attack on Titans Time Limit: 2 Seconds      Memory Limit: 65536 KB Over centuries ago, mankind faced a new enemy, th 阅读详情

题目链接:

http://poj.org/problem?id=1037

题目大意:

给一个n,求出1~n组成波浪形按字典序的第m种序列。

解题思路:

经典dp+计数。

之前做个一道,只需求所有的种数,但现在要求第m种,所以要考虑计数,所以不能仅以长度和上升下降两维来处理,还需增加一维表示以某个开始。

dp[i][j][0]表示长度为i,以第j长的开始,且前两个为下降的种数。只和相对长度有关,故此处j指第j长的。1表示上升。

重点是计数,先找从小到大找第1个,如果m<=该数开始的种数时,说明第一位一定是该数。

找到第一位后,记录后面一位的取值范围,在这个范围内依次找第二位,找的时候如果m>=该数开始的种数,则去掉该种数,继续往后找。

代码:

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#define eps 1e-6
#define INF 0x1f1f1f1f
#define PI acos(-1.0)
#define ll __int64
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;

/*
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
*/
ll dp[22][22][2]; //dp[i][j][0]表示长度为i时,第j长的作为第一位且前两位下降的种数
                  //dp[i][j][1]表示长度为i时,第j长的作为第一位且前两位上升的种数
bool vis[22];

int main()
{
   dp[1][1][0]=dp[1][1][1]=1;
   for(int i=2;i<=20;i++)
      for(int j=1;j<=i;j++) //放到第一位
      {
         for(int p=1;p<j;p++) //小于j的,不变
            dp[i][j][0]+=dp[i-1][p][1];
         for(int p=j;p<i;p++) //大于等于j的,依次+1。只和相对高度有关
            dp[i][j][1]+=dp[i-1][p][0];
      }

   ll n,m;
   int t;

   scanf("%d",&t);
   while(t--)
   {
      scanf("%I64d%I64d",&n,&m);
      int l=1,r=n,j;
      bool find=false;
      memset(vis,false,sizeof(vis));

      for(int i=1;i<=n&&!find;i++) //计数
      {
         for(j=0;j<2;j++)
         {
            m-=dp[n][i][j];
            if(m<=0) //说明找到了首位
            {
               m+=dp[n][i][j];
               vis[i]=true;
               printf("%d",i);
               if(!j) //下降的形式
                  l=1,r=i-1;
               else
                  l=i+1,r=n;
               find=true;
               break;
            }
         }
      }
      j^=1; //后面一位肯定是相反形式的
      for(int i=n-1;i>=1;i--)//还需要找n-1位
      {
         int cnt=0;
         for(int p=1;p<l;p++)
            if(!vis[p])
               cnt++; //统计小的,统计l~r之间符合要求数的相对位置
         for(int p=l;p<=r;p++)
         {
            if(!vis[p])
            {
               cnt++;//相对位置
               m-=dp[i][cnt][j];
               if(m<=0)//一定是该位
               {
                  m+=dp[i][cnt][j];
                  vis[p]=true;
                  printf(" %d",p);
                  if(!j)
                     l=1,r=p-1;
                  else
                     l=p+1,r=n;
                  j=j^1;
                  break;
               }
            }
         }
      }
      putchar('\n');
   }
   return 0;
}


递推计数-hdu-4747-Mex 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4747 题目大意: 给n个数,求所有区间内没有出现的最小非负整数和。 解题思路: 首先感谢大神博客:http://www.cnblogs.com/xin-hua/p/3325154.html可以解释的太少了。 我再解释一遍。 首先要明白,以i结束的所有区间的值的和记为f[i]肯定不超 阅读详情

相关推荐

[高精度+递推] uva 10328 Coin Toss

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1269 Toss is an important part of any event. When everything becomes equal toss is the ulti

cc_again的专栏 4678

poj1037 A decorative fence<DP>

链接:http://poj.org/problem?id=1037 题意: 有N条木板,长度不同,分别为1,2,……,N单位长度。现在要将这N条木板排成不在边缘的木板,两边相邻的木板要么都比它高,要么都比它低,成波浪形排列。 现将这些排列按字典排序,即第一条木板较短的排前面,若第一条木板相同,则第二条木板相同的排前面,以此类推;最后,从1开始对排列方法编号。 现输入木板条数N和编号C,要求...

weixin_30725315的博客 96

读书笔记:深度学习入门-基于python的理论与实现(俗称鱼书)

终于从头到尾把鱼书看完啦,真的是非常入门,非常查漏补缺,对新手很友好,对有一定基础的人也非常不错。看完不复习等于没看,所以今天开始复盘,顺便写这篇读书笔记。希望分享给没看过这本书或者看过这本书的同僚们参考,欢迎大家指教。我将从第三章神经网络开始复习,前两章内容书里已经非常基础and清楚了。(会持续更新滴).........

博客而已 1万+

动态规划 POJ 1037 A decorative fence

这道题还是比较难想出来的,我也搞了好久才搞懂,而且是在问了大牛的基础上才搞清楚的。反而觉得黑书上没有讲清楚,现在我们来具体看看这道题的思路吧。        我们这样看一个符合条件的序列,例如一个长度为n的序列,当我们去定了前面的k项的时候,后面剩下的n-k项与1到n-k的符合条件的序列有一个一一对应的关系。这便是我们使用动态规划的动机,存在重叠子问题。于是我们如下定义状态: dp[i][j]

Bright 3444

什么是 WhatsApp云控 WhatsApp群发,WhatsApp协议,他们有什么区别?

下面我们sensws讲解下什么是WhatsApp云控 WhatsApp群发,WhatsApp协议

sendws的博客 3875

Pywinauto与Inspect.exe完美搭配:解决Windows应用UI自动化中的元素定位难题

本文详细介绍了如何将Pywinauto与Inspect.exe结合,以解决Windows应用UI自动化中的核心难题——元素定位。通过实战指南,阐述了如何利用Inspect.exe在UIA模式下精准侦察控件属性,并将这些信息转化为Pywinauto的稳健定位策略,从而高效自动化WPF、WinForms等现代框架构建的复杂桌面应用。

weixin_29297127的博客 520

POJ 1037 A decorative fence DP+排列计数 *

题目地址:http://poj.org/problem?id=1037  #include #include #include #include using namespace std; typedef long long LL; const int UP=0,DOWN=1,maxn=20+5; LL C[maxn][maxn][2],R; //C[i][k][DOWN] 是S(i)中以第k短的

BRCOCOLI的博客 309

DeepSeek+知网研学:三步搞定文献矩阵与对比分析(实战指南)

本文提供了一套高效实用的文献管理分析实战指南,详细介绍了如何结合DeepSeek大模型与知网研学平台,通过三个核心步骤快速完成文献梳理。该方法能自动提炼文献核心要素、生成结构化对比矩阵,并辅助发现研究空白,显著提升学术研究者的文献分析效率与深度。

weixin_29061509的博客 491

A decorative fence (POJ - 1037,计数类 DP)

一.题目链接: POJ-1037 二.题目大意: 输入两个整数 n,c 要求输出字典序为 c 的 1~n 的**排列. **排列是指长度为 n,每个数字为 1~n 且数字不重复且大小高低交错的排列. 三.分析: 可以用 “试填法” 来确定排名为 c 的排列. 具体来说,我们可以枚举第一个数的大小 当第一个数为 a[1] 时,设后面 n - 1 个数构成的**排列方案数为 t 若...

The___Flash的博客 377

从论文到生产:iSLIP优先级匹配算法在SDN交换机中的20年演进史

本文回顾了iSLIP优先级匹配算法在SDN交换机中的20年演进历程,从斯坦福大学的原始论文到现代芯片实现。通过独特的指针滑动和迭代循环机制,iSLIP算法显著提升了交换机的吞吐量和公平性,解决了传统FIFO调度的队头阻塞问题。文章详细探讨了算法在硬件实现中的工程挑战、开源实践及未来AI时代的智能调度方向。

weixin_29230649的博客 331

Python爬虫实战:从巨潮网批量抓取上市公司年报JSON数据

网络爬虫作为自动化数据采集的核心技术,其原理是通过模拟浏览器行为向服务器发送HTTP请求并解析响应,从而高效获取结构化信息。在金融数据分析领域,这项技术价值尤为突出,能够将研究人员从繁琐的手工数据收集中解放出来,聚焦于更高阶的模型构建与价值挖掘。典型的应用场景包括上市公司财务研究、市场趋势分析和风险预警系统开发。本文以Python的requests库为核心工具,详细解析如何通过分析巨潮资讯网的JSON数据接口,构建一个稳定、高效的上市公司年报数据采集管道,并重点探讨了接口逆向、分页爬取、PDF文件下载等关键

weixin_42529366的博客 1237

POJ 1037 A decorative fence(dp+排列计数)

设置状态c[i][k][down or up]意思是从i根木棒中选择第k短的放在第一根的上升或者下降的方案数。 先dp预处理,然后类似康托算出排列。 // // main.cpp // Richard // // Created by 邵金杰 on 16/9/7. // Copyright © 2016年 邵金杰. All rights reserved. // #include

qq_33901573的博客 224

FinRL实战:5步搞定股票量化交易策略(附Python代码)

本文详细介绍了如何使用FinRL框架,通过5个步骤构建基于深度强化学习的股票量化交易策略。内容涵盖从环境搭建、数据获取与预处理,到交易环境构建、模型训练(如PPO算法),以及策略回测评估与优化的完整流程,并提供了可运行的Python代码示例,帮助读者快速入门AI驱动的量化交易。

weixin_29062865的博客 630

POJ 1037 A decorative fence(dP+排列计数)(目前没搞懂的dp)

Description Richard just finished building his new house. Now the only thing the house misses is a cute little wooden fence. He had no idea how to make a wooden fence, so he decided to order one. Som...

超逸の学习技术博客 677

解决windows10下无法安装.net framework 3.5(包括.net2.0和3.0)

入域电脑,win10系统中安装 .net framework 3.5(包括.net2.0和3.0)

God_me_1的博客 4万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

[POJ1037] [CEOI2002] A decorative fence [计数][dp]

[Link\frak{Link}Link]

最后一次修改 445

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【计数类DP,试填法】POJ 1037 A decorative fence

链接 http://poj.org/problem?id=1037 大意 给定nnn块木板,每块木板的长度为1,,n1,,n1,,n求在使木板必须按照高低交错排列的情况下的第mmm种排列 思路 首先,我们可以预处理第一个木板是高的还是低的两种情况下,到第iii块,左边是jjj号木板是第几种排列,可以得出方程 第一块是高的 f[i,j]=∑k=1k&lt;jg[...

Ajwallet 518

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

[POJ 1037] A decorative fence

[题目链接] http://poj.org/problem?id=1037 [算法] DP [代码] #include <algorithm> #include <bitset> #include <cctype> #include <cerrno> ...

89

poj 1037 A decorative fence

<br />//poj 1037 A decorative fence 经典的DP+计数 /* 题解:dp[len][i][0]表示长度为len的序列,第i长的棒起头,前两根下降的方案数;dp[len][i][1]表示相应的前两根上升的方案数 只要想到方案中只要求交替上升下降,只与长度的相对高低有关系就不难想出这样的dp方法了。预处理完后就是一般的计数方法了。 心得:本题又暴露出自己的不自信,明明是正确的方法,只是实现上出现也小bug,就怀疑自己。看来心理素质还是比较重要。 */

birdforever的专栏 1974

POJ 1037 A decorative fence题解

题目简介 简单的翻译一下题目,题目要求最终的木条要么是中间的比两边的大,要么是中间的比两边的小,更形象一些,最终的图形就是W型或者M型 算法初步分析 这个题我是在动态规划的专题里看到的,所以我就用DP的思路来说一下这个题,目前这个题我也没有想出其他的更好的想法。 说到DP,核心就是状态转移方程了,那这个题如何来确定状态转移方程 我们使用两个数组来记录W,M型的拼法个数 up[i][j]表示第一根...

weixin_43258754的博客 366

ACM/ICPC 之 DP-浅谈“排列计数” (POJ1037)

  这一题是最近在看Coursera的《算法与设计》的公开课时看到的一道较难的DP例题,之所以写下来,一方面是因为DP的状态我想了很久才想明白,所以借此记录,另一方面是看到这一题有运用到 排列计数 的方法,虽然排列计数的思路简单,但却是算法中一个数学优化的点睛之笔。      Poj1037 A decorative fence   题意:有K组数据(1~100),每组数据给...

disuo8001的博客 381

POJ1037 A decorative fence

题目大意(转) 有N条木板,长度不同,分别为1,2,……,N单位长度。现在要将这N条木板排成可爱的形状,所谓可爱的形状,是指对于不在边缘的木板,两边相邻的木板要么都比它高,要么都比它低,成波浪形排列。 N条木板有若干种可爱的排列方法,现将这些排列按字典排序,即第一条木板较短的排前面,若第一条木板相同,则第二条木板相同的排前面,以此类推;最后,从1开始对排列方法编号。 现输入木板条

shaonianguai 823

【DP专辑】ACM动态规划总结

动态规划一直是ACM竞赛中的重点

cc_again的专栏 2万+

[dp] Codeforces 429B B. Working out

题目链接: http://codeforces.com/problemset/problem/429/B PROBLEMS SUBMIT STATUS STANDINGS CUSTOM TEST B. Working out time limit per test 2 seconds memory li

cc_again的专栏 9715

组合dp hdu-4489-The King’s Ups and Downs

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4489 题目意思: 给一个n,求n个高矮不同的人排成一排使得高、矮依次排列的种数。 解题思路: 组合dp. 对于n个人,设其高度分别为1,2,3,,,,,n.   对于第n个人,假设前面的n-1个人已经放好了。第n个人有n个位置可放,对于任一位置j,显然第n个人的身高n大于前n-1个

cc_again的专栏 4974

计数dp-hdu-4054-Number String

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4055 题目大意: 给一个只含‘I','D','?'三种字符的字符串,I表示当前数字大于前面的数字,D表示当前的数字小于前面一位的数字,?表示当前位既可以小于又可以大于。 问1~n的排列中有多少个满足该字符串。 解题思路: 计数dp. dp[i][j]表示长度为i字符串,最后一个数为

cc_again的专栏 4481
上一篇: 模拟+二分 poj-1019-Number Sequence
下一篇: dp poj 1080 Human Gene Functions
Accagain
博客等级 码龄14年 376粉丝 316原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值