Dp思想,将两个序列合并变成
a
1
,
a
2
,
.
.
.
a
m
,
b
m
,
b
m
−
1
,
.
.
.
b
1
a_1,a_2,...a_m,\mathbf{ b_m,b_{m-1},...b1}
a1,a2,...am,bm,bm−1,...b1那么这个序列只要单调不减就可以了。
所以,问题转化成了一个序列中元素的取值在
[
1
,
n
]
[1,n]
[1,n]范围内,满足单调不减的序列有多少种
我们可以设
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j]表示序列在第
i
i
i个位置,取值小于等于
j
j
j的方案数
#include<bits/stdc++.h>usingnamespace std;#define ll long longconst ll mod =1e9+7;intmain(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);int n, m;
cin >> n >> m;
ll ans =0;
vector<vector<int>>dp(2*m+1,vector<int>(n+2,0));for(int i=1;i<=2*m;i++){for(int j=1;j<=n;j++){if(i==1) dp[i][j]=1;else{
dp[i][j]=(dp[i-1][j]+dp[i][j-1])%mod;}if(i==2*m) ans=(ans+dp[i][j])%mod;}}
cout << ans % mod << endl;return0;}