1 条题解

  • 0
    @ 2021-11-06 19:02:39

    50pts:
    由于只有一行,用一维数组扫一遍即可。
    实际上好像能过80pts,只能说数据水了...

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
        int n,m;
        cin>>n>>m;
        int a[m+1]; 
        for(int i=1;i<=m;i++) cin>>a[i];
        for(int i=1;i<=m;i++) 
            if(i==m || a[i]>=a[i+1]){cout<<i-1;break;}
    }
    

    140pts:
    经典的dfs的方法探索迷宫,由于这张图一定没有环,所以连vis数组都不需要使用。

    #include<bits/stdc++.h>
    using namespace std;
    int a[1005][1005], n, m, ans = 0;
    int d[4][2] = {
        0,1,
        1,0,
        -1,0,
        0,-1
    };
    void dfs(int x, int y, int val)
    {
        ans = max(ans, val);
        for(int i=0;i<4;i++)
        {
            int dx = x+d[i][0], dy = y+d[i][1];
            if(dx<=0 || dx>n || dy<=0 || dy>m || a[dx][dy] <= a[x][y]) continue;
            dfs(dx, dy, val+1);
        }
    };
    int main()
    {
        cin>>n>>m;
        for(int i=1;i<=n;i++)for(int j=1;j<=m;j++) cin>>a[i][j];
        dfs(1, 1, 0);
        cout<<ans<<'\n';
    }
    

    200pts:
    注意到,单纯用dfs的复杂度可能非常大。
    采用记忆化搜索的方法,如果在搜索中求得了某个点出发的长度\(dp_{ij}\),就记录在数组中,下次不用再花费时间求解了。
    则,若\(_{i'j'}\to _{ij}\),则有转移方程\(dp_{ij} = max(dp_{ij}, dp_{i'j'}+1)\)
    时间复杂度是\(O(nm)\)

    Code:

    #include<bits/stdc++.h>
    using namespace std;
    int r,c,m[505][505],dp[505][505],ans;
    int d[4][2]={
        1,0,
        -1,0,
        0,1,
        0,-1
    };
    int solve(int i,int j)
    {
        if(i<=0||j<=0||i>r||j>c) return 0;
        if(dp[i][j]!=0) return dp[i][j];
        dp[i][j] = 1;
        for(int w=0;w<4;w++) 
            if(m[i][j]<m[i+d[w][0]][j+d[w][1]])
                dp[i][j]=max(dp[i][j],solve(i+d[w][0],j+d[w][1])+1);
        return dp[i][j];
    }
    int main()
    {
        cin>>r>>c;
        for(int i=1;i<=r;i++) for(int j=1;j<=c;j++) cin>>m[i][j];
        cout<<solve(1,1)-1<<endl;
    } 
    
  • 1

信息

ID
1298
难度
8
分类
(无)
标签
递交数
87
已通过
11
通过率
13%
被复制
1
上传者