Hackerrank Medium(50) Permutation Happiness 递推
2017-05-02 12:57
417 查看
点击打开链接
题意:若有一个数它前面或者后面一个数比它大 则该数为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;
}
题意:若有一个数它前面或者后面一个数比它大 则该数为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;
}
相关文章推荐
- hackerrank_Permutation game
- HackerRank "Permutation game"
- [线段树][单调栈]HackerRank 101 Hack 50 .Boxes for Toys
- 【HackerRank】Red John is Back (Dynamic programming)简单递推
- HackerRank Medium(30) Maximal AND Subsequences 贪心+计数
- HackerRank Medium(30) Super Six Substrings DP+数学
- HackerRank "Favorite sequence"
- 【HackerRank】Gem Stones
- 【HackerRank】 Sherlock and The Beast
- 【HackerRank】Encryption
- 2016 Multi-University Training Contest 3 hdu 5753 Permutation Bo【打表+递推】
- *[hackerrank]Maximizing XOR
- HackerRank Between Two Sets
- HackerRank "Misère Nim"
- HackerRank "K Factorization"
- leetcode 567【medium】---Permutation in String
- HackerRank "Shashank and List"
- 二叉排序树的判断(hackerrank) java
- Hackerrank--Ashton and String (后缀数组)
- HackerRank - candies 【贪心】