P6855-「EZEC-4.5」走方格【dp】
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                P6855-「EZEC-4.5」走方格【dp】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                正題
題目鏈接:https://www.luogu.com.cn/problem/P6855
題目大意
n?mn*mn?m的網格,每個格子有一個數,可以選擇一個位置變為000。要求最小化最大權值和路徑。
解題思路
考慮枚舉哪個位置變為000,一個位置變為000后我們將路徑分為兩種路徑,一種是經過該點的路徑,一種是不經過該點的路徑。
我們預處理出fi,jf_{i,j}fi,j?表示(1,1)(1,1)(1,1)走到(i,j)(i,j)(i,j)的最大權和,gi,jg_{i,j}gi,j?表示(i,j)(i,j)(i,j)走到(n,m)(n,m)(n,m)的最大權和。然后我們發現如果不走(x,y)(x,y)(x,y)這個位置,那么一會走(i,y)?>(i,y+1)(i,y)->(i,y+1)(i,y)?>(i,y+1)其中i<xi<xi<x或者(x,j)?>(x+1,j)(x,j)->(x+1,j)(x,j)?>(x+1,j)其中j<yj<yj<y。用ggg和fff計算這些走法的最大權值和即可。
時間復雜度O(nm)O(nm)O(nm)
codecodecode
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=2100,XJQ=998244353; ll n,m,ans,a[N][N],f[N][N],g[N][N],ar[N][N],br[N][N]; signed main() {scanf("%lld%lld",&n,&m);for(ll i=1;i<=n;i++)for(ll j=1;j<=m;j++){scanf("%lld",&a[i][j]);f[i][j]=max(f[i-1][j],f[i][j-1])+a[i][j];}for(ll i=n;i>=1;i--)for(ll j=m;j>=1;j--){g[i][j]=max(g[i+1][j],g[i][j+1])+a[i][j];ar[i][j]=f[i][j]+g[i+1][j];br[i][j]=f[i][j]+g[i][j+1];}ans=1e18;for(ll i=1;i<=n;i++)for(ll j=1;j<=m;j++){ll z=max(f[i][j]+g[i][j]-2*a[i][j],max(ar[i][j-1],br[i-1][j]));ans=min(ans,z);if(j!=1)ar[i][j]=max(ar[i][j],ar[i][j-1]);if(i!=1)br[i][j]=max(br[i][j],br[i-1][j]);}printf("%lld",ans); }總結
以上是生活随笔為你收集整理的P6855-「EZEC-4.5」走方格【dp】的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 微软 Win11 25987 开始将 X
 - 下一篇: 宥怎么读 宥字应该怎么读