首页 > 代码库 > hdu4489(递推dp)
hdu4489(递推dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4489
题意:给一个n,求n个高矮不同的人排成一排使得高、矮依次排列的种数。
详细思路参考:http://blog.csdn.net/bossup/article/details/9915647
这类题都是独立出最后一个再分情况讨论如何排进去。
#include <cstdio>#include <cstring>#include <cmath>#include <iostream>#include <algorithm>#include <queue>#include <cstdlib>#include <stack>#include <vector>#include <set>#include <map>#define LL long long#define mod 1000000007#define inf 0x3f3f3f3f#define N 1000010#define clr(a) (memset(a,0,sizeof(a)))using namespace std;LL dp[21][2],ans[21],c[21][21];void init(){ for(int i=0;i<=20;i++)c[i][0]=c[i][i]=1; for(int i=1;i<=20;i++) for(int j=1;j<i;j++)c[i][j]=c[i-1][j-1]+c[i-1][j]; dp[0][0]=dp[0][1]=dp[1][1]=dp[1][0]=1;ans[1]=1; for(int i=2;i<=20;i++) { for(int j=1;j<=i;j++) { ans[i]+=c[i-1][j-1]*dp[j-1][0]*dp[i-j][1]; } dp[i][0]=dp[i][1]=ans[i]/2; }}int main(){ int t,cas,n;init(); scanf("%d",&t); while(t--) { scanf("%d%d",&cas,&n); printf("%d %I64d\n",cas,ans[n]); }}
hdu4489(递推dp)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。