B. Find the Spruce(递推)

起初想法时暴力搜索,但是忽略了数据范围,直接给T了。当时还硬着头皮想推出个什么公式加上搜索做出来,

到后来看到题解后才发现递推才是正道。不过递推的顺序是从下往上来的,从上往下来也可以,不过很麻烦。

从下往上走,每当碰到一棵云杉点的时候这个点就是它下面三个点的最小值 +1,如果不是云杉点,那么就要

将这个点的值设为0,因此还需要一个整数数组用来统计。

#include <bits/stdc++.h>
using namespace std;

const int N = 505;
char maze[N][N];
int ans[N][N];
int n, m; 
int check(int x, int y){
    if(maze[x][y] != '*')
        return 0;
    if(maze[x][y] == '*')
        if(x == n || y == 1 || y == m)
            return 1;
        
    int minn = 0x3f3f3f3f;
    for(int i = y - 1; i <= y + 1; i ++)
        minn = min(minn, ans[x + 1][i] + 1);
    
    return minn;
}
int main(){
    int t;
    cin >> t;
    while(t --){
        memset(ans, 0, sizeof ans);
        cin >> n >> m;
        for(int i = 1; i <= n; i ++)
            cin >> maze[i] + 1;
        int res = 0;
        for(int i = n; i >= 1; i --){
            for(int j = 1; j <= m; j ++){
                res += check(i, j);
                ans[i][j] = check(i, j);
            }
        }
        cout << res << endl;
    }
    
    
    return 0;
}
原文地址:https://www.cnblogs.com/pureayu/p/14152302.html