红小豆发现第一场的可以挂出来了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; }
I Points Division
参考于此:https://blog.csdn.net/u013534123/article/details/96465704
正在魔改,研究为什么不能(能)从右上往左下扫点,尚无合理结果。。。