為什麼大家都是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點共走了兩次,試找出兩條這樣的路徑,使得取得的數字...