[基础dp] cf div2 80C

题目

在这里插入图片描述
题目链接: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;
}

发布了3 篇原创文章 · 获赞 0 · 访问量 218

猜你喜欢

转载自blog.csdn.net/kosf_/article/details/104119087