【codeforces 19/10/26 div2】E.Rock In Push

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 using namespace std;
 5
 6 #define mfor(i,a,b) for(register int i=(a);i<=(b);i++)
 7 #define mrep(i,a,b) for(register int i=(a);i>=(b);i--)
 8 typedef long long int LL;
 9
10 const int maxn = 2010;
11 const int mod = 1e9 + 7;
12 char a[maxn][maxn];
13 LL sumd[maxn][maxn];
14 LL sumr[maxn][maxn];
15 LL f[maxn][maxn][2];    //第三维0向右,1向下
16 int n, m;
17
18 int main()
19 {
20     cin >> n >> m;
21     mfor(i, 1, n)
22     {
23         //scanf_s("%s", a[i] + 1, maxn);
24         scanf(" %s", a[i] + 1);
25     }
26     if (n == m && n == 1)
27     {
28         if (a[1][1] == ‘.‘)
29         {
30             cout << 1;
31             return 0;
32         }
33     }
34     mrep(i, n, 1)
35     {
36         mrep(j, m, 1)
37         {
38             sumd[i][j] = sumd[i][j + 1] + (a[i][j] == ‘R‘ ? 1 : 0);
39             sumr[i][j] = sumr[i + 1][j] + (a[i][j] == ‘R‘ ? 1 : 0);
40         }
41     }
42     mfor(i, 1, n - 1)
43     {
44         if (!sumr[i][m]) f[i][m][0] = 1;
45     }
46     mfor(i, 1, m - 1)
47     {
48         if (!sumd[n][i]) f[n][i][1] = 1;
49     }
50     mrep(i, n - 1, 1)
51     {
52         mrep(j, m - 1, 1)
53         {
54             (f[i][j][0] += f[i + 1][j][1]) %= mod;
55             (f[i][j][1] += f[i][j + 1][0]) %= mod;
56             if (a[i + 1][j] == ‘R‘) (f[i][j][0] += f[i + 1][j][0] - f[n - sumr[i + 1][j] + 1][j][1] + mod) %= mod;
57             else (f[i][j][0] += f[i + 1][j][0]) %= mod;
58             if (a[i][j + 1] == ‘R‘) (f[i][j][1] += f[i][j + 1][1] - f[i][m - sumd[i][j + 1] + 1][0] + mod) %= mod;
59             else (f[i][j][1] += f[i][j + 1][1]) %= mod;
60         }
61     }
62     cout << (f[1][1][0] + f[1][1][1]) % mod;
63 }

原文地址:https://www.cnblogs.com/thjkhdf12/p/11751703.html

时间: 2024-11-05 15:58:04

【codeforces 19/10/26 div2】E.Rock In Push的相关文章

【codeforces 19/10/24 div2】C. Minimize The Integer

1 #include<iostream> 2 #include<string> 3 #include<queue> 4 #include<stack> 5 #include<vector> 6 #include<map> 7 #include<cstdio> 8 #include<cstdlib> 9 #include<algorithm> 10 #include<set> 11 #in

【codeforces 19/11/06 div2】A. Maximum Square

1 #include<iostream> 2 #include<algorithm> 3 #include<map> 4 using namespace std; 5 6 map<int, int>cnt; 7 8 int main() 9 { 10 int T; 11 cin >> T; 12 while (T--) 13 { 14 cnt.clear(); 15 int n; 16 cin >> n; 17 for (int i

【codeforces 19/11/06 div2】C. Tile Painting

1 #include <iostream> 2 using namespace std; 3 4 typedef long long LL; 5 6 LL gcd(LL a, LL b) 7 { 8 if (!b) return a; 9 return gcd(b, a % b); 10 } 11 12 int min(int a, int b) 13 { 14 return a < b ? a : b; 15 } 16 17 int main() 18 { 19 LL x; 20 ci

【codeforces 19/11/06 div2】D. 0-1 MST

1 #include<iostream> 2 #include<set> 3 #include<map> 4 #include<queue> 5 #include<algorithm> 6 using namespace std; 7 8 const int maxn = 100010; 9 int n, m; 10 set<int>e[maxn]; 11 set<int>node; 12 int fa[maxn]; 13

【Codeforces Global Round 1 C】Meaningless Operations

[链接] 我是链接,点我呀:) [题意] 给你一个a 让你从1..a-1的范围中选择一个b 使得gcd(a^b,a&b)的值最大 [题解] 显然如果a的二进制中有0的话. 那么我们就让选择的b的二进制中对应的位置为1 剩下全为0就好 这样a的二进制全都变成1之后就是答案了(gcd的右边是0). 但是如果a的二进制里面全是1的话. 就没办法这么构造了 这里有两种情况. ①.1的个数是偶数 那么就101010这样构造 另外一个数就是010101 答案就是010101转换成十进制 ②.1的个数是奇数

【Codeforces Round#279 Div.2】B. Queue

这题看别人的.就是那么诚实.http://www.cnblogs.com/zhyfzy/p/4117481.html B. Queue During the lunch break all n Berland State University students lined up in the food court. However, it turned out that the food court, too, has a lunch break and it temporarily stopp

洛谷 P2089 烤鸡【DFS递归/10重枚举】

[链接]:https://www.luogu.org/problemnew/show/P2089 题目描述 猪猪Hanke特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke吃鸡很特别,为什么特别呢?因为他有10种配料(芥末.孜然等),每种配料可以放1—3克,任意烤鸡的美味程度为所有配料质量之和 现在,Hanke想要知道,如果给你一个美味程度,请输出这10种配料的所有搭配方案 输入输出格式 输入格式: 一行,n<=5000 输出格式: 第一行,方案总数 第二行至结束,10个数,表示每种配料所放的

【 Codeforces Global Round 1 B】Tape

[链接] 我是链接,点我呀:) [题意] x轴上有m个连续的点,从1标号到m. 其中有n个点是特殊点. 让你用k段区间将这n个点覆盖. 要求区间的总长度最小. [题解] 一开始假设我们需要n个胶带(即包含每一个点) 然后因为k<=n 所以可能胶带不够用. 那么就得一个胶带跨过两个点. 怎么选择最好呢? 可以把b[i]-b[i-1]-1处理出来排个序. (优先取较小的花费) 然后取前n-k个累加和sum. 因为每取一个就少用一段胶带. 然后sum+n就是答案了 [代码] import java.i

【Codeforces Global Round 1 A】Parity

[链接] 我是链接,点我呀:) [题意] 给你一个k位数b进制的进制转换. 让你求出来转成10进制之后这个数字是奇数还是偶数 [题解] 模拟一下转换的过程,加乘的时候都记得对2取余就好 [代码] import java.io.*; import java.util.*; public class Main { static int N = (int)1e5; static InputReader in; static PrintWriter out; static int b,k; static