博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA 1638 Pole Arrangement (dp)
阅读量:6170 次
发布时间:2019-06-21

本文共 1262 字,大约阅读时间需要 4 分钟。

题意:有n个长度为1到n的柱子排列在一起,从左边看有l根从右边看有r根,问你所以排列中满足这种情况的方案数

 

题解:就是一个dp问题,关键是下标放什么,值代表什么

   使用三维dp,dp[i][j][k]=l;

   i:从左边看的个数,j:从右边看的个数,k:后k根柱子,l:方案数

   可以这样想:每次加上去的是比当前最小柱子小一的柱子,这样就可以发现,这根柱子放在k个位置都很好判断

   即:dp[i][j][k]=dp[i-1][j][k-1](放在最左边)+dp[i][j-1][k-1](放在最右边)+dp[i][j][k-1]*(k-2)(放在中间k-2个位置)

 

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;#define eps 1E-8/*注意可能会有输出-0.000*/#define sgn(x) (x<-eps? -1 :x
0.0 ? x+eps : x-eps)//浮点数转化#define zero(x) (((x)>0?(x):-(x))
>b)typedef long long ll;typedef unsigned long long ull;const int Inf=1<<28;const ll INF=1LL<<60;const double Pi=acos(-1.0);const int Mod=1e9+7;const int Max=25;ll dp[Max][Max][Max];ll Solve(int l,int r,int n){ memset(dp,0,sizeof(dp)); dp[1][1][1]=1; for(int k=2;k<=n;++k) { for(int i=1;i<=k;++i) { for(int j=1;j<=k;++j) { dp[i][j][k]=dp[i-1][j][k-1]+dp[i][j-1][k-1]+dp[i][j][k-1]*(ll)(k-2); } } } return dp[l][r][n];}int main(){ int t; int l,r,n; scanf("%d",&t); while(t--) { scanf("%d %d %d",&n,&l,&r); cout << Solve(l,r,n) << endl; } return 0;}

 

转载于:https://www.cnblogs.com/zhuanzhuruyi/p/6608256.html

你可能感兴趣的文章
Oracle12C本地用户的创建和登录
查看>>
使用JS制作一个鼠标可拖的DIV(一)——鼠标拖动
查看>>
HDU problem 5635 LCP Array【思维】
查看>>
leetcode10. 正则表达式匹配
查看>>
redis常用命令--zsets
查看>>
springcloud--Feign(WebService客户端)
查看>>
网络攻击
查看>>
sorting, two pointers(cf div.3 1113)
查看>>
Scala并发编程【消息机制】
查看>>
win10下安装Oracle 11g 32位客户端遇到INS-13001环境不满足最低要求
查看>>
AngularJS-01.AngularJS,Module,Controller,scope
查看>>
【MySQL 安装过程1】顺利安装MySQL完整过程
查看>>
Inno Setup入门(二十)——Inno Setup类参考(6)
查看>>
图片自适应
查看>>
amd cmd
查看>>
Linux下的uml画图工具
查看>>
xml返回数组数据
查看>>
约瑟夫问题总结
查看>>
spring mybatis 批量插入返回主键
查看>>
指针函数小用
查看>>