题目
题目链接:https://codeforces.com/contest/1288/problem/C
题意
有两个集合,第一个位递增集合第二个为递减集合,集合长度为m,集合里面的数字在1-n内。求第二个集合大于第一个集合有多少种可能。
思路
第一个集合递增,第二个集合递减,但第二个集合恒大于的一个集合。可以把第二个集合换一个顺序,全变为递增,即求有多少个递增的集合。
如 1234 8765 ->1234 5678
dp[i][j] 为第i位的数字为j
dp[i][j]不仅要继承上一排,即dp[i-1][j]的方案数,还要加上比它小的的同位数的可能性即dp[i][j-1]
转移方程:p[i][j]=dp[i-1][j]+dp[i][j-1]
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int INF = 0x3f3f3f3f;
ll dp[1010][2010];
int mod=1e9+7;
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
ll n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
dp[0][i]=1;
}
for(int i=1;i<=2*m;i++){
for(int j=1;j<=n;j++){
dp[i][j]=((dp[i-1][j]%mod)+dp[i][j-1]%mod)%mod;
}
}
cout<<dp[2*m][n]<<endl;
return 0;
}