這道題的難度還是有的,比賽的時候第一直覺是dp可是感覺直接做有後效性。所以還是上爆搜吧……然後完美10分。
解題思路
最終程式
還是乖乖地學dp吧……
設有 ? × ? 的方格圖,每個方格中都有乙個整數。現有乙隻小熊,想從圖的左上角走到右下角,每一步只能向上、向下或向右走一格,並且不能重複經過已經走過的方格,也不能走出邊界。小熊會取走所有經過的方格中的整數,求它能取到的整數之和的最大值。
輸入輸入檔名為 number.in。
第 1 行兩個正整數 ?, ?。
接下來 ? 行每行 ? 個整數,依次代表每個方格中的整數。
輸出輸入檔名為 number.out。
乙個整數,表示小熊能取到的整數之和的最大值。
樣例輸入
3 41 -1 3 2
2 -1 4 -1
-2 2 -3 -1
2 5-1 -1 -3 -2 -7
-2 -1 -4 -1 -2
-10資料範圍限制
對於 20% 的資料,?, ? ≤ 5。
對於 40% 的資料,?, ? ≤ 50。
對於 70% 的資料,?, ? ≤ 300。
對於 100% 的資料,1 ≤ ?, ? ≤ 1000。方格中整數的絕對值不超過 10^4。
還是找到了老曾,然後老曾就讓我看了看他的部落格
理解了一下就開始打了。
因為這道題不是普通的dp,所以我們就要用不普通的方法做。
首先設三個狀態:
up: 設 ui,
ju_
ui,j
為(i,j)從上面過來的最大值。
down:設 di,
jd_
di,j
為(i,j)從下面過來的最大值。
left:設 li,
jl_
li,j
為(i,j)從左邊過來的最大值。
首先我們思考,如果要從上面來到(i,j)我們應該如何轉移?
因為是上面下來轉移,所以我們排除down轉移,只有剩下的兩個轉移方向,而我們就可以得知方程:ui,
j=ma
x(ui
−1,j
,li−
1,j)
u_=max(u_,l_)
ui,j=
max(
ui−1
,j,
li−1
,j)
。現在考慮從左邊轉移過來的方程,左邊的話沒有限制,所以直接轉移三種方向:li,
j=ma
x(li
,j−1
,ui,
j−1,
di,j
−1
)l_=max(l_,u_,d_)
li,j=
max(
li,j
−1,
ui,j
−1,
di,j
−1)
。而從下面轉移過來的才是最特殊的,因為是從下面轉移,所以我們只能另起乙個迴圈從n-1to1。而這裡,就排除掉了從上面轉移的可能:di,
j=ma
x(di
+1,j
,li+
1,j)
d_=max(d_,l_)
di,j=
max(
di+1
,j,
li+1
,j)
最終答案,從上面或左邊轉移過(n,m)的最大值。
#include
using
namespace std;
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
int n,m;
int a[
1005][
1005];
long
long f[
1005][
1005
],u[
1005][
1005
],d[
1005][
1005
],l[
1005][
1005];
long
long
max(
long
long x,
long
long y)
intmain()
u[1][
1]=d[1][
1]=l[1][
1]=a[1][
1];for
(int j=
1;j<=m;
++j)
for(
int i=n-
1;i>=1;
--i) d[i]
[j]=
max(d[i+1]
[j],l[i+1]
[j])
+a[i]
[j];
}printf
("%lld"
,max
(l[n]
[m],u[n]
[m]));
return0;
}
2020 CSP第二輪 入門組 優秀的拆分
不得不說,這題還是有點上頭的。還是那句話 當你意識到普及組不簡單時,一切已經晚了 一般來說,乙個正整數可以拆分成若干個正整數的和。例如,1 1,10 1 2 3 4 等。對於正整數 的一種特定拆分,我們稱它為 優秀的 當且僅當在這種拆分下,被分解為了若干個不同的 2 的正整數次冪。注意,乙個數 能被...
CSP2020第二輪遊記
今年csp第二輪在jz考 嘛,因為初賽去過了。就沒什麼感覺了 超大,徒步的話腳直接 廳沒有可以睡舒服的地方差評 中午起來後,就是迷迷糊糊的進入考場 然後看題之前,密碼一直不對。後來發現忘打括號心態 之後看第一題 好傢伙,等我先打個暴力 30min later 可以 年1e9 直接二分 但就是一直調。...
CSP2020第二輪J組簡析
祝各位noiprp 題,奇數 1,偶數從大往小列舉2的次方 include using namespace std int n,k long long a 30 int main a 0 1 k 0 while a k n a k 1 a k 2 k for int i k i i if a i n...