http://acm.hdu.edu.cn/showproblem.php?pid=4489
解题思路这里已经说的很清楚了:
http://blog.csdn.net/bossup/article/details/9915647
这里就说下遇到这种问题应该怎么想。
因为是排列问题,一般都是从某个点开始推,寻找限制条件,但这道题不一样,因为每个数据都是不同的。
所以这时就要找边界条件,要么从最高点入手,要么从最低点入手。
以最高点为例,在任意一个点j放置最高点。
由题意可以知道两端的排列情况,前面两个肯定是高低,后面两个肯定是低高
此时总排列数即为 最高点前面一堆的排列数A * 最高点后面那堆的排列数B
最高点前面那堆数字可能的情况有 C(j-1,n-1)
结果就是A*B*C(j-1,n-1)
再遍历所有最高点可能的位置,就能得到总排列数
#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <stack>
using namespace std; #define MEM(a,b) memset(a,b,sizeof(a))
#define pf printf
#define sf scanf
#define debug printf("!/m")
#define INF 1100000
#define MAX(a,b) a>b?a:b
#define blank pf("\n")
#define LL long long
#define M 1000000007 LL dp[INF][]; LL cal[][];//C(m,n) int main()
{
LL n,i,j,t,num,ans; //记录组合数
for(i = ;i<=;i++)
{
cal[i][] = cal[i][i] = ;
for(j =;j<i;j++)
{
//C(n,m)= C(n-1,m-1)+C(n-1,m)
cal[i][j] = cal[i-][j-] + cal[i-][j];
}
} dp[][] = dp[][] = dp[][] = dp[][] = ; //记录总方法数
for(i = ;i<=;i++)//i为总个数
{
ans = ;
for(j =;j<i;j++)//j为最高点位置
{
ans+= dp[j][]*dp[i-j-][]*cal[i-][j];//递推
}
dp[i][]=dp[i][] = ans/;//更新dp
} sf("%lld",&n);
while(n--)
{
sf("%lld%lld",&t,&num);
if(num==)
{
pf("%lld 1\n",t);
continue;
}
pf("%lld %lld\n",t,dp[num][]<<);
} return ;
}
HDU 4489(DP)的更多相关文章
-
hdu 5534(dp)
Input The first line contains an integer T indicating the total number of test cases. Each test case ...
-
HDU 5800 (DP)
Problem To My Girlfriend (HDU 5800) 题目大意 给定一个由n个元素组成的序列,和s (n<=1000,s<=1000) 求 : f (i,j,k,l, ...
-
hdu 5464(dp)
题意: 给你n个数,要求选一些数(可以不选),把它们加起来,使得和恰好是p的倍数(0也是p的倍数),求方案数. - - 心好痛,又没想到动规 #include <stdio.h> #inc ...
-
HDU 2571(dp)题解
命运 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...
-
Find a path HDU - 5492 (dp)
Find a path Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
-
饭卡 HDU - 2546(dp)
电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够).所以大家 ...
-
hdu 1024(dp)
传送门:Max Sum Plus Plus 题意:从n个数中选出m段不相交的连续子段,求这个和最大. 分析:经典dp,dp[i][j][0]表示不取第i个数且前i个数分成j段达到的最优值,dp[i][ ...
-
AreYouBusy HDU - 3535 (dp)
AreYouBusy Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
-
HDU 2577(DP)
题意:要求一个字符串输入,按键盘的最少次数.有Caps Lock和Shift两种转换大小写输入的方式 思路:用dpa与dpb数组分别记录Caps Lock的开关状态,dpa表示不开,dpb表示开 代码 ...
随机推荐
-
asp.net创建事务的方法
1.建立List用于存放多条语句 /// <summary> /// 保存表单 /// </summary> /// <param name="context& ...
-
memcached的图形界面监控
前提是已经安装了php和memcached 图形界面的监控是通过memcache.php来实现的, 1.把该php程序拷贝到apache的web根目录 [root@cacti srv]# ...
-
C#:实现快捷键自定义设置(转)
项目开发过程中,需要实现类似有道词典的软件设置中的自定义快捷键功能,如下图所示: 当我们相继按下Ctrl+Alt+M的时候,软件就会自动将快捷键显示在文本框中. 最终的效果如下图所示: private ...
-
VB6的函数指针传递
Option Explicit Private Declare Function CallWindowProc Lib "user32" Alias "CallWindo ...
-
openstack 云平台API
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABVYAAAKrCAIAAACV8EEMAAAgAElEQVR4nOydeVgUaZ7n/W9299nd7n
-
iOS开发之字典数据建立模型步骤
1. 在控制器属性的(questions)set方法中完成字典转模型的操作 - (NSArray *)questions { if (nil == _questions) { //1.加载plist文 ...
-
JavaScript实现表单的全选,反选,获取值
构思 通过for循环和for in循环来实现,界面效果如下 步骤 全选: 循环给所有的表单设置checked 反选: 循环内判断checked是否为true,如果为true则改为false否则改为tr ...
-
elasticsearch问题解决之分片副本UNASSIGNED
在上一篇文章中,我记录了在windows下同一台机器上搭建es集群的步骤,第二天在向集群中创建索引的时候,出现了分片副本未分配的情况(UNASSIGNED). 虽然并不影响数据的插入和查询,但是有问题 ...
-
javascript 易错知识点合集
为什么 typeof null === 'object' 原理是这样的,不同的对象在底层都表示为二进制,在JavaScript中二进制前三位都为0的话会被判断为 object 类型, null 的二进 ...
-
转 如何在IOS设备中去掉屏幕上的status bar
引入如何在IOS设备中去掉屏幕上的status bar,即:不显示设备上方的[网络.时间.电池??]条?操作方法一:在-info.list项目文件中,加上“Status bar is initiall ...