題目傳送門[
小淵和小軒是好朋友也是同班同學,他們在一起總有談不完的話題。一次素質拓展活動中,班上同學安排做成乙個m行n列的矩陣,而小淵和小軒被安排在矩陣對角線的兩端,因此,他們就無法直接交談了。幸運的是,他們可以通過傳紙條來進行交流。紙條要經由許多同學傳到對方手裡,小淵坐在矩陣的左上角,座標(1,1),小軒坐在矩陣的右下角,座標(m,n)。從小淵傳到小軒的紙條只可以向下或者向右傳遞,從小軒傳給小淵的紙條只可以向上或者向左傳遞。
在活動進行中,小淵希望給小軒傳遞一張紙條,同時希望小軒給他回覆。班裡每個同學都可以幫他們傳遞,但只會幫他們一次,也就是說如果此人在小淵遞給小軒紙條的時候幫忙,那麼在小軒遞給小淵的時候就不會再幫忙。反之亦然。
還有一件事情需要注意,全班每個同學願意幫忙的好感度有高有低(注意:小淵和小軒的好心程度沒有定義,輸入時用0表示),可以用乙個0−100的自然數來表示,數越大表示越好心。小淵和小軒希望盡可能找好心程度高的同學來幫忙傳紙條,即找到來回兩條傳遞路徑,使得這2條路徑上同學的好心程度之和最大。現在,請你幫助小淵和小軒找到這樣的2條路徑。
輸入檔案,第一行有2個用空格隔開的整數m和n,表示班裡有m行n列。
接下來的m行是乙個m×n的矩陣,矩陣中第i行j列的整數表示坐在第i行j列的學生的好心程度。每行的n個整數之間用空格隔開。
輸出檔案共一行,包含乙個整數,表示來回2條路上參與傳遞紙條的學生的好心程度之和的最大值。
輸入:3 3
0 3 9
2 8 5
5 7 0
輸出:34
【限制】
30%的資料滿足:1≤m,n≤10
100%的資料滿足:1≤m,n≤50
想法取於本題題解首位
可以認為是左上角的人同時傳兩張紙條給右下角的人,路徑不重複
一般的想法是思維dp[i][j][k][l],i,j,k,l分別代表兩個點的橫縱座標
但是仔細思考可以發現在本題中存在乙個性質:
對於任意乙個時刻,兩張紙條在同一條斜線上(把每個同學當做乙個點,建立乙個m×n的棋盤)
在同一條斜線上的座標滿足橫縱座標之和相等
所以可以用乙個k表示某時刻兩個紙條此時的橫縱座標之和
同時,只需要單獨表示紙條的橫座標i,就可以用k-i來表示其縱座標
可以設f[k][i][j],i,j分別表示兩個紙條的橫座標
狀態轉移方程為f[k][i][j]=max(f[k-1][i-1][j-1],f[k-1][i][j],f[k-1][i-1][j],f[k-1][i][j-1])+a[k-i][i]+a[k-j][j];
當然,要先判斷是否可以達到這乙個狀態(具體見**)
#include #include #include #define r register
#define ll long long
using namespace std;
int read()
while(c >= '0' && c <= '9')
return x * f;
}int m,n;
int h[61][61];
int f[121][61][61];
void init()
void doit()
printf("%d\n",f[m+n-1][n-1][n]);//右下角的點肯定達不到的,事實上,只要是右下角上面或者左邊的那個點的狀態就歐克了
}signed main()
洛谷1006 傳紙條
棋盤dp,化雙向為單向 視作從左上往右下傳兩張紙條且路勁不重複。又由於只能向右或向下傳遞,所以兩張紙條過程中必定處於同一斜線上,即橫縱座標之和相等。這樣就得到了降維的關鍵。用dp s i j 表示紙條1走到第i行,紙條2走到第j行時的最大好心程度,那麼方程也不難推得了。include include...
洛谷 1006 傳紙條
小淵和小軒是好朋友也是同班同學,他們在一起總有談不完的話題。一次素質拓展活動中,班上同學安排做成乙個mm行nn列的矩陣,而小淵和小軒被安排在矩陣對角線的兩端,因此,他們就無法直接交談了。幸運的是,他們可以通過傳紙條來進行交流。紙條要經由許多同學傳到對方手裡,小淵坐在矩陣的左上角,座標 1,1 1,1...
洛谷P1006 傳紙條
這是一道四維dp題,注意陣列要開得恰好,不然會爆記憶體。維數越高,每一維上的數字大1的空間代價就越大 因為有限制條件每個數只能訪問一次,所以要判斷兩個人是否走到了同乙個格,以及他們上一步是否在同乙個格。如果兩個人走到了同乙個格,就跳過這次迴圈 如果兩個人上一步在同乙個格,就跳過這種情況,不再比較。動...