CSP J 2020 T4 方格取數 題解

2021-10-10 08:23:54 字數 2967 閱讀 3498

為什麼大家都是dp啊,我只會寫記憶化搜尋。。。

題目簡潔明瞭,考場上看完這道題後我想到了這道題: n∗m

n * m

n∗m 的網格中,小熊從左上角走到右下角,只能向右或向下走,每個格仔有權值 ai,

ja_

ai,j

​,求出一條路徑使路上權值和最大。(大家應該都做過)

轉移方程 (我竟然用了dp) :fi,

j=

max⁡(f

i−1,

j,fi

,j−1

)+ai

,j

f_=\max,f_)+a_}

fi,j​=

max(fi

−1,j

​,fi

,j−1

​)+a

i,j​

這道題只是多加了乙個向上的方向,但是二維就不能計算了。

怎麼辦?直接加一維方向!

由於我用的是記憶化搜尋,這裡寫一下思路:

首先, dfs 內設 3 個引數 x

xx,y

yy,dis

disdi

s(我為什麼會用 dis ???),表示走到 (x,

y)

(x,y)

(x,y

) (注意是第 x

xx 行 y

yy 列 而不是座標系中的 (x,

y)

(x,y)

(x,y

))時怎麼走過來的。 dis

=0

dis=0

dis=

0 表示向下走, dis

=1

dis=1

dis=

1 表示向上走, dis

=2

dis=2

dis=

2 表示這個點是這一列第乙個被走到的點,想走**就走**。

由於每乙個方格只能經過一次,因此一旦這一列的路徑方向定了就不能改變。

搜尋時:

令 a ns

ansan

s 表答案:

d is

=2

dis=2

dis=

2 時,ans

=max⁡(

dfs(

x,y−

1,2)

,dfs

(x+1

,y,0

),df

s(x−

1,y,

1))+

ax,y

ans=\max (dfs(x,y-1,2),dfs(x+1,y,0),dfs(x-1,y,1))+a_

ans=

max(df

s(x,

y−1,

2),d

fs(x

+1,y

,0),

dfs(

x−1,

y,1)

)+ax

,y​。

d is

=0

dis=0

dis=

0 時,ans

=max⁡(

dfs(

x,y−

1,2)

,dfs

(x+1

,y,0

))+a

x,

yans=\max (dfs(x,y-1,2),dfs(x+1,y,0))+a_

ans=

max(df

s(x,

y−1,

2),d

fs(x

+1,y

,0))

+ax,

y​,注意不能向下走

d is

=1

dis=1

dis=

1 時,ans

=max⁡(

dfs(

x,y−

1,2)

,dfs

(x−1

,y,1

))+a

x,

yans=\max (dfs(x,y-1,2),dfs(x-1,y,1))+a_

ans=

max(df

s(x,

y−1,

2),d

fs(x

−1,y

,1))

+ax,

y​。

這種程度的搜尋相信各位都想的出來,接下來加上記憶化陣列 f

ff 就可以完美 ac 了!

int 一時爽,溢位火葬場!
**:

#include

using

namespace std;

const

int maxn=

1000+10

;const

long

long min=

-1e18

,minn=

-1e17

;int n,m,a[maxn]

[maxn]

;long

long f[maxn]

[maxn][5

];long

long

max(

long

long fir,

long

long sec)

//最好手打max

long

long

dfs(

int x,

int y,

int dis)

else

else

}return f[x]

[y][dis]

=ans;

}int

main()

總結:

csp-j 的 dp 題都能用記憶化搜尋寫,既然我們會爆搜,加記憶化又很簡單,所以我們為什麼不寫記憶化搜尋呢?

如果想寫 dp 轉移方程的,可以參照其他大佬的題解。(其實上面**改一下就出來了qwq)

CSP J2020 T4 方格取數

考慮對每一列進行 dp。記 f i,j 代表從 1,1 走到第 i 列第 j 行的最大值,sum i,j,k 代表在第 i 列中第 j 行到第 k 行的數字之和。那麼很明顯地,當 i 1 時 f i,j 一定收到 f i 1,k 中的其中乙個 k 推導出。而從 f i 1,k 走到 f i,j 就需...

NOIP2000 T4方格取數

先從動規刷起 做了這麼一道題,2000年的老題,提高組第四題 題目描述 description 設有n n的方格圖 n 10,我們將其中的某些方格中填入正整數,而其他的方格中則放入數字0。如下圖所示 見樣例 某人從圖的左上角的a 點出發,可以向下行走,也可以向右走,直到到達右下角的b點。在走過的路上...

1277 方格取數

設有n n的方格圖,我們在其中的某些方格中填入正整數,而其它的方格中則放入數字0。如下圖所示 某人從圖中的左上角a出發,可以向下行走,也可以向右行走,直到到達右下角的b點。在走過的路上,他可以取走方格中的數 取走後的方格中將變為數字0 此人從a點到b點共走了兩次,試找出兩條這樣的路徑,使得取得的數字...