又是乙個比較老的題@_@
設有 n×n 的方格圖 (n≤9),我們將其中的某些方格中填入正整數,而其他的方格中則放入數字 0。如下圖所示(見樣例):
a0 0 0 0 0 0 0 0
0 0 13 0 0 6 0 0
0 0 0 0 7 0 0 0
0 0 0 14 0 0 0 0
0 21 0 0 0 4 0 0
0 0 15 0 0 0 0 0
0 14 0 0 0 0 0 0
0 0 0 0 0 0 0 0
b某人從圖的左上角的 a點出發,可以向下行走,也可以向右走,直到到達右下角的 b點。在走過的路上,他可以取走方格中的數(取走後的方格中將變為數字 0)。
此人從 a點到 b點共走兩次,試找出 2條這樣的路徑,使得取得的數之和為最大。
輸入格式:
輸入的第一行為乙個整數 n(表示 n×n 的方格圖),接下來的每行有三個整數,前兩個表示位置,第三個數為該位置上所放的數。一行單獨的 0 表示輸入結束。
輸出格式:
只需輸出乙個整數,表示 2條路徑上取得的最大的和。
輸入樣例#1:
82 3 13
2 6 6
3 5 7
4 4 14
5 2 21
5 6 4
6 3 15
7 2 14
0 0 0
輸出樣例#1:
67
本題為noip2003 提高組第4題看一下資料範圍顯然不可以dfs所以考慮用dp
本身是乙個基本的從上方、右側兩個點轉移的問題(dp[i][j]=max(dp[i-1][j],dp[i][j-1])+map[i][j])
然而現在有乙個問題就是如何解決兩個人的走法
本人最開始考慮走兩次然而受dp性質的影響走完之後每個點都會變成0
現在有三種想法
比較快的spfa
網路流費用流
更高維度的dp
(為什麼能夠想到四維的dp??
受dp本身性質的影響dp各維度之間除轉移之外各個狀態是不會互相影響的
於是可以同時考慮兩條路線)
然而我是不會告訴你我前兩個都不會的
這樣我們就得到了轉移方程
dp[i][j][k][l]=max(max(dp[i-1][j][k-1][l],dp[i-1][j][k][l-1]),max(dp[i][j-1][k][l-1],dp[i][j-1][k-1][l]))+map[i][j]+map[k][l];
(當然要判斷i==k&&j==l的情況)
上**
#includeusingnamespace
std;
int n,x,y,val,ans=0,maxn,dp[12][12][12][12],map1[12][12];//
a[i][j][k][l]表示兩個人同時走,乙個走i,j 乙個走k,l
intmain()
for(int i=1;i<=n;i++)}}
}printf(
"%d\n
",dp[n][n][n][n]);
return0;
}
對於這個題是一道很典型的dp(把每個點當作揹包的物品)
大家可以用來學習dp的表示、轉移等
重點在於理解dp的並行性質
暑假集訓總結
華信暑假集訓總結 暑假乙個月的總結 第一 就是不夠細心,關於這一點,在前兩次的總結都有提到,但是自己這次還是沒有改正過來,說明自己確實是粗心,不過在以後的學習過程中還是要克服這個問題!第二 自己寫的 結構很亂,模擬較多時,經常都會找不到自己在 定義的,這個又是在 寫的。所以在接下來的過程中,自己還是...
暑假集訓總結
暑假集訓這就結束了,這個暑假算是上學以來最充實的乙個暑假了,乙個暑假除了休息的兩個周之外,都在好好的學習,雖然每天從早坐到晚,一直在電腦面前冥思苦想,一遍遍的問自己 我到底錯在哪了 但還是有好多的收穫,學習到了知識,提高了自己寫 的能力,鍛鍊了思考問題的能力,而且還提前體驗一把碼農的感覺,近乙個月的...
暑假集訓總結
三十五天的集訓生活,伴隨著我們最後一次的個人賽的結束而結束了。這乙個多月的三點一線的生活,讓我再次感受到,為自己目標奮鬥的滿足感!1,集訓,讓我收穫的不僅僅是學習新的知識,還教會了我做人做事的大道理。從剛開始的分組賽到個人賽再到組隊賽,整個暑假集訓經歷了二十幾場比賽,很感激自己能一直遵守比賽規則到最...