哎呦我操帕秋莉怎么这么坏啊

这题直接浪费了我大好的一个上午加中午的学习时间,我现在正在一边啃着我最爱的腰果一边控诉这道题:

思路上很明显,虽然说这题一股子BFS味,但是为了求所有方式,复杂度上DFS又不合适,我们自然而然想到了DP。“情况”也很明显——不同位置走到的方式,同时只能向上向右走又保证了有单调性。思路就这么简单。这道题本身也是超级无敌的板子题,熟悉DP用的

但!是!有三点必须注意!

1,他虽然给了快读模板,但这种还是自己备用一个比较合适,我备用的是这个:

string read()
{
    string ss;
    
    char ch = getchar();
    
    while(ch=='\n'||ch=='\r'||ch==' ') ch=getchar();
    
    while(ch!='\n'&&ch!='\r')
    {
        if(ch!=' ') ss+=ch;
        
        ch=getchar();
        
        if(ch==EOF) break;
    }
    return ss;
}

2:我们一定要先把段错误限制条件给写在前面啊!

if(r + 1 < m && dp[r + 1][p] >= 0)——对

if(dp[r + 1][p] >= 0 && r + 1 < m)——错

这个是大一上就学过的知识点,这是我的问题,我反思自己.jpg

3:我们取MOD,一定要注意每一步都要取MOD!(25%,我就是因为这个被硬控了)

AC代码:

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

string read()
{
    string ss;
    
    char ch = getchar();
    
    while(ch=='\n'||ch=='\r'||ch==' ') ch=getchar();
    
    while(ch!='\n'&&ch!='\r')
    {
        if(ch!=' ') ss+=ch;
        
        ch=getchar();
        
        if(ch==EOF) break;
    }
    return ss;
}

signed main() 
{ 
    int m,n;
    
    cin>>m>>n;
    
    vector<vector<int>> dp(m,vector<int>(n,0));
    
    for(int r = m - 1;r >= 0;r--)
    {
        string temp = read();
        
        for(int p = 0;p < n;p++)
        {
            if(temp[p] == '1')
            {
                dp[r][p] = -1;//这里用LLONG_MIN会导致全部变为0?
            }
        }
    }
    
    dp[0][0] = 1;
    
    for(int r = 0;r < m;r++)
    {
        for(int p = 0;p < n;p++)
        {
            if(dp[r][p] >= 0)
            {
                if(r + 1 < m && dp[r + 1][p] >= 0)
                {
                    dp[r + 1][p] += dp[r][p];
                    
                    dp[r + 1][p] = dp[r + 1][p] % 2333;
                }
                
                if(p + 1 < n && dp[r][p + 1] >= 0)//唉又写反了
                {
                    dp[r][p + 1] += dp[r][p];
                    
                    dp[r][p + 1] = dp[r][p + 1] % 2333;
                }
            }
        }
    }
    
    cout<<(dp[m - 1][n - 1] % 2333)<<endl;
    
    return 0;
}