红小豆发现第一场的可以挂出来了owo

 

E  ABBA

  当时读题之后想得很复杂,什么B前面得有n个A,A前面得有m个B,然后就睡着了(x

  补题的时候感觉确实是这么个思路,参考了官方题解楼的众位大佬写的题解,比较容易理解的思路大概是这样:

    如果当前B的数量没有比A多m个,那么仍可以继续放B;

    如果当前A的数量没有比B多n个,那么仍可以继续放A,并且与上述情况不互斥

  需要注意的地方是,如果用每次都用memset清空dp数组就会tle,只能是用多少清空多少(多次加入debuglist豪华套餐)。转移的时候要用到上一位的情况,就整个数组挪一位。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
int d[2005][2005];
int n, m;

int main()
{
    while (cin >> n >> m) {
        for (int i = 1; i <= n + m + 1; i++)
            for (int j = 1; j <= n + m + 1; j++)
                d[i][j] = 0;
        d[1][1] = 1;
        for (int i = 1; i <= n + m+1; i++)
            for (int j = 1; j <= n + m+1; j++) {
                if (j - i <= m)d[i][j] = (d[i][j] + d[i][j - 1]) % mod;
                if (i - j <= n)d[i][j] = (d[i][j] + d[i - 1][j]) % mod;
            }
        cout << d[n + m + 1][n + m + 1] << endl;
    }

    return 0;
}
E ABBA

 

I  Points Division

  参考于此:https://blog.csdn.net/u013534123/article/details/96465704

  正在魔改,研究为什么不能(能)从右上往左下扫点,尚无合理结果。。。

 posted on 2019-07-27 11:52  Nonad  阅读(100)  评论(0编辑  收藏  举报