Codeforces Round #689 (Div. 2)的其他题解点我
题目大意:
直接用vjudge上的了
思路:
我们在输入时把*标记为1(用一个新数组dp[i][j])
然后疯狂枚举整个矩阵
如果一个带 * 的上面左边右边的值都相等,则中间+1
即
010
111
的情况
那么变成
010
121
多层的大概就是这样
00100
01210
12321
以此类推,然后由于每次改变会影响当前次数枚举(指枚举矩阵的次数)的后面的枚举
所以我们要先用一个数组存下上一次枚举(指枚举矩阵)的值
然后疯狂枚举就好
在每次值添加的时候ans加一
数据范围500
我们枚举500次
时间复杂度n^3
AC代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<map>
#include<set>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn = 603;
char a[maxn][maxn];
int dp[maxn][maxn];
int pre[maxn][maxn];
int n, m;
int sum = 0;
int main() {int T;scanf("%d", &T);while (T--) {memset(dp,0,sizeof(dp));memset(pre, 0, sizeof(pre));scanf("%d %d", &n, &m);getchar();ll ans = 0;for (int i = 1; i <= n; ++i) {for (int j = 1; j <= m; ++j) {scanf("%c", &a[i][j]);if (a[i][j] == '*')ans++, dp[i][j] = 1;else dp[i][j] = 0;}getchar();}for (int t = 1; t <= 500;t++) {for (int i = 1; i <= n; ++i)for (int j = 1; j <= m; ++j)pre[i][j] = dp[i][j];for (int i = 1; i <= n; ++i) {for (int j = 1; j <= m; ++j) {if (a[i][j] != '*')continue;if (pre[i][j]&&pre[i - 1][j] == pre[i][j - 1]&& pre[i][j - 1]== pre[i][j + 1]&&pre[i][j+1]==pre[i][j])dp[i][j]++,ans++;}}}printf("%lldn",ans);}
}
本文发布于:2024-02-02 00:59:19,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170681180040376.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |