您的位置:首页 > 移动开发

Hackerrank Medium(50) Permutation Happiness 递推

2017-05-02 12:57 381 查看
点击打开链接

题意:若有一个数它前面或者后面一个数比它大 则该数为happy,给出n,k<=3000问1~n的排列中 至少有k个happy数的排列个数 

dp
[k] 排列1~n中 不开心的数有k个

一个不开心的数两边都是开心的数,所以不会出现连续两个uphappy,1~n排列:1~n-1的排列中插入n,n是最大的 所以肯定unhappy 

1~n-1排列总共有n位置插入,把n插入到unhappy 左边或者右边 unhappy个数不变(少了被插入的unhappy,多了n这个unhappy)

剩下n-2*k位置中 插入N 会导致unhappy个数增加1

得到递推公式 d
[k]=d[n-1][k]*2*k+d[n-1][k-1]*(n-2*(k-1))  O(N*K)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int N=3e3+20;
const int M=3e3;
ll d

;//dp
[k] 排列1~n中 不开心的数有k个
int main()
{
d[1][1]=1;
for(ll i=2;i<=M;i++)
{
for(ll k=1;k<=i;k++)
{
d[i][k]=(d[i-1][k]*2*k+d[i-1][k-1]*(i-2*(k-1)))%mod;
}
}
int q,n,k;
cin>>q;
while(q--)
{
scanf("%d%d",&n,&k);
//至少k个 happy 则unhappy有1~n-k个
ll ans=0;
for(int i=1;i<=n-k;i++)
ans=(ans+d
[i])%mod;
cout<<ans<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: