zoukankan      html  css  js  c++  java
  • CSP2020-j2 T4 方格取数

    一:暴力dfs(25分)没有任何优化

    #include<bits/stdc++.h>
    using namespace std;
    int n,m;
    int fx[3][2]={{-1,0},{1,0},{0,1}};
    int book[1005][1005];
    int mp[1005][1005];
    struct node{
        int x,y;
    }que[1000005];
    int f,r;
    int ans,maxn;
    
    void pr(){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                cout<<mp[i][j]<<" ";
            }
            cout<<endl;
        }
    }
    
    void dfs(int x,int y){
        if(x==1 && y==1){
            book[x][y]=1;
            ans=mp[x][y];
        }
        
        if(x==n && y==m){
            maxn=max(ans,maxn);
            return;
        }
        
        for(int i=0;i<3;i++){
            int sx=x+fx[i][0];
            int sy=y+fx[i][1];
            
            if(sx<1 || sx>n || sy<1 || sy>m) continue;
            
            if(book[sx][sy]==0){
                ans+=mp[sx][sy];
                book[sx][sy]=1;
                dfs(sx,sy);
                ans-=mp[sx][sy];
                book[sx][sy]=0;
            }
        }
    }
    
    int main(){
        cin>>n>>m;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                cin>>mp[i][j];
            }
        }
    //    pr();
    //    cout<<"1"<<endl;
        dfs(1,1);
        cout<<maxn<<endl;
        return 0;
    }

    二:dp

    由于需要在而为的基础上加一个存方向的值的数,所以需要三维dp

    f[i][j][f[i][j][→]](f[i][j][0]f[i][j][0]) 表示从当前格子的左边走到当前格子能取到的最大整数之和。

    f[i][j][f[i][j][↓]](f[i][j][1]f[i][j][1]) 表示当前格子的上边边走到当前格子能取到的最大整数之和。

    f[i][j][f[i][j][↑]](f[i][j][2]f[i][j][2]) 表示当前格子的下边走到当前格子能取到的最大整数之和。

    先进行第 列的填值。
    因为其处在整个地图的最左侧,所以只有 ↓ 方向是可以取到格子里的数的(如果向上走,最后必将无路可走)。
    f[i][1][1] = f[i-1][1][1] + a[i][1]
    然后再进行第 2 ~ m 列的填值。
    先填 → 方向及 ↓ 方向的值,再从下往上填 ↑ 方向的值

    f[i][j][0] = max(f[i][j-1][0],f[i][j-1][1],f[i][j-1][2]) + a[i][j]
    f[i][j][1] = max(f[i-1][j][0],f[i-1][j][1]) + a[i][j])
    f[i][j][2] = max(f[i+1][j][0],f[i+1][j][2]) + a[i][j])
    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define inf -1e17
    ll f[1005][1005][3];
    ll a[1005][1005];
    int n,m;
    ll maxx(ll a,ll b)
    {
        return a>b ?a :b;
    }
    int main()
    {
        cin>>n>>m;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                cin>>a[i][j];
                f[i][j][0] = inf;
                f[i][j][1] = inf;
                f[i][j][2] = inf;
    
            }
        }
        f[1][1][0]=a[1][1];
        f[1][1][1]=a[1][1];
        f[1][1][2]=a[1][1];
        for(int i=2;i<=n;i++)
        {
            f[i][1][1] = f[i-1][1][1] + a[i][1];
        }
        for(int j=2;j<=m;j++)
        {
            for(int i=1;i<=n;i++)
            {
                f[i][j][0]=maxx(f[i][j-1][1],maxx(f[i][j-1][0],f[i][j-1][2]))+a[i][j];
                if(i>=2) f[i][j][1]=maxx(f[i-1][j][0],f[i-1][j][1])+a[i][j]; 
            }
            for(int i=n-1;i>=1;i--)
            {
                f[i][j][2]=maxx(f[i+1][j][0],f[i+1][j][2])+a[i][j];
            }
        }
        cout<<maxx(f[n][m][0],maxx(f[n][m][1],f[n][m][2]));
        return 0;
    }
  • 相关阅读:
    高级特性(4)- 数据库编程
    UVA Jin Ge Jin Qu hao 12563
    UVA 116 Unidirectional TSP
    HDU 2224 The shortest path
    poj 2677 Tour
    【算法学习】双调欧几里得旅行商问题(动态规划)
    南洋理工大学 ACM 在线评测系统 矩形嵌套
    UVA The Tower of Babylon
    uva A Spy in the Metro(洛谷 P2583 地铁间谍)
    洛谷 P1095 守望者的逃离
  • 原文地址:https://www.cnblogs.com/qwn34/p/14975540.html
Copyright © 2011-2022 走看看