Educational Codeforces Round 80 (Rated for Div. 2)C(DP)

 1 #define HAVE_STRUCT_TIMESPEC
 2 #include<bits/stdc++.h>
 3 using namespace std;
 4 const long long mod = 1e9+7;
 5 long long pre[1007][1007],temp[1007][1007];
 6 int main(){
 7     ios::sync_with_stdio(false);
 8     cin.tie(NULL);
 9     cout.tie(NULL);
10     int n,m;
11     cin>>n>>m;
12     for(int i=1;i<=n;++i){
13         pre[1][i]=1;
14         temp[1][i]=1;
15     }
16     for(int i=2;i<=m;++i)//当前位
17         for(int j=1;j<=n;++j)//第i位以数字j结尾
18             for(int k=1;k<=j;++k)//保证非降序
19                 pre[i][j]=(pre[i][j]+pre[i-1][k])%mod;//状态转移
20     for(int i=2;i<=m;++i)//当前位
21         for(int j=1;j<=n;++j)//第i位以数字j结尾
22             for(int k=j;k<=n;++k)//保证非升序
23                 temp[i][j]=(temp[i][j]+temp[i-1][k])%mod;//状态转移
24     long long ans=0;
25     for(int i=1;i<=n;++i)//枚举第二个数组以数字i作为结尾
26         for(int j=1;j<=i;++j)//枚举第一个数组以数字j作为结尾,j<=i保证了第一个数组最大的都小于等于第二个数组最小的,所以整个数组全部满足小于等于关系
27             ans=(ans+(temp[m][i]*pre[m][j])%mod)%mod;//相乘得到答案
28     cout<<ans;
29     return 0;
30 }
posted @ 2020-01-15 12:42  sewage  阅读(168)  评论(0编辑  收藏  举报