Educational Codeforces Round 80. C - Two Arrays
Posted stelayuri
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Educational Codeforces Round 80. C - Two Arrays相关的知识,希望对你有一定的参考价值。
题面:https://codeforces.com/contest/1288/problem/C
题目大意:
给定n和m,有两个数组,两个数组的长度都等于m
数组内每个元素都在1到n中
对于两个数组对应的位置i,必须满足a[i]<=b[i]
a数组必须是不下降的序列
b数组必须是不上升的序列
求有多少种ab数组的排列方案满足上述题意
解题思路:
因为a不下降,b不上升,所以a总体呈上升趋势(或趋平),b总体呈下降趋势(或趋平)
所以只要满足a[m]<=b[m]即可让这个序列方案满足题意
或者说,将a数组左右对称后拼接在b数组后面,使得整个数组完全呈严格下降趋势的时候,即可满足题意
因此进行动态规划,令dp[i][j]表示第i个元素值为j时的方案数
对于整个数组全是最大值n的情况,显而易见只有一种方案数,所以dp[1~2m][n]=1
其后,第一个元素值为j时,方案数明显只有1;第i个元素值为j时,方案数为第i-1个元素为j时的方案数加上第i个元素为j+1时的方案数相加得到
故得到状态转移方程为
dp[i][j]=dp[i-1][j]+dp[i][j+1]
最后取答案时,累加dp[2m][1~n]的所有方案数即可
1 /* 2 Written By. StelaYuri 3 On 2020/01/14 4 */ 5 #include<bits/stdc++.h> 6 using namespace std; 7 typedef long long ll; 8 const ll mod=1000000007; 9 ll dp[25][2010]; 10 int main(){ 11 ios::sync_with_stdio(0); 12 cin.tie(0);cout.tie(0); 13 ll n,m,i,j,ans=0; 14 cin>>n>>m; 15 for(i=1;i<=2*m;i++) 16 dp[i][n]=1; 17 for(j=n-1;j;j--){ 18 dp[1][j]=1; 19 for(i=2;i<=2*m;i++) 20 dp[i][j]=(dp[i-1][j]+dp[i][j+1])%mod; 21 } 22 for(j=n;j;j--) 23 ans=(ans+dp[2*m][j])%mod; 24 cout<<ans; 25 26 return 0; 27 }
以上是关于Educational Codeforces Round 80. C - Two Arrays的主要内容,如果未能解决你的问题,请参考以下文章
Educational Codeforces Round 7 A
Educational Codeforces Round 7
Educational Codeforces Round 90
Educational Codeforces Round 33