hdu3664 Permutation Counting(dp)
2024-09-02 22:02:09
hdu3664 Permutation Counting
题意:
在一个序列中,如果有k个数满足a[i]>i;那么这个序列的E值为k,问你
在n的全排列中,有多少个排列是恰好是E值为k的序列?
思路:
定义dp[i][j]: 在 i 的全排列中,E值为j的个数;则从i转移到i+1时,有三种情况:
1)把i+1加到最后,E值不变;
2)把i+1与那些已经满足a[i]>i的数交换,E值不变;
3)把i+1与那些不满足a[i]>i的数交换,E值加一。
根据上面得到的转移方程为:
dp[i][j]=(dp[i-1][j]+dp[i-1][j]*j+dp[i-1][j-1]*(i-j))%mod;
代码:
#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
#include<math.h>
#include<queue>
#include<stack>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long long ll;
typedef pair<int,int> PII;
#define mod 1000000007
#define pb push_back
#define mk make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
//head
#define N 1001
ll dp[N][N];
int n,k;
int main()
{
for(int i=;i<=;i++)//注意这里的i只能到1000,不然会超时
{
dp[i][]=;
for(int j=;j<i;j++)
{
dp[i][j]=(dp[i-][j]+dp[i-][j]*j+dp[i-][j-]*(i-j))%mod;
}
}
while(~scanf("%d %d",&n,&k))
{
printf("%lld\n",dp[n][k]);
}
return ;
}
最新文章
- 大数据系列(4)——Hadoop集群VSFTP和SecureCRT安装配置
- 关于XE10下Indy发送字符串编码的问题
- WebKit技术内幕
- 1.Windows安装PostgreSQL
- sqlserver 链接 ODBC 访问 MySql
- 一些站点使用的服务器软件、js 框架大收集 [ 整理中 ]
- IOS设计模式之一(MVC模式,单例模式)
- Linux Shell编程(6)——变量替换
- Qt Style Sheets帮助文档 Overview
- HDU 3478 Play with Chain (Splay树)
- PHP 将MySQL数据导出csv
- deepin Gtk-WARNING **: 无法在模块路径中找到主题引擎:“adwaita”
- C#常用工具类——Excel操作类(ZT)
- Mac下,如何把项目托管到github
- C# 根据部分属性来判断俩个对象是否相同
- keepalived高可用系列~通用基础
- VS Code中Matlab插件安装设置
- TFS撤销其他人的迁出
- WPF之ListView使用WrapPanel
- VB 中窗口发现冲突名称,将使用名称...怎么解决?