日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

nyoj 61 传纸条(一) (双线动归)nyoj 探寻宝藏

發(fā)布時間:2025/3/16 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nyoj 61 传纸条(一) (双线动归)nyoj 探寻宝藏 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

傳紙條(一)

時間限制:2000 ms ?|? 內(nèi)存限制:65535 KB 難度:5 描述

小淵和小軒是好朋友也是同班同學(xué),他們在一起總有談不完的話題。一次素質(zhì)拓展活動中,班上同學(xué)安排做成一個m行n列的矩陣,而小淵和小軒被安排在矩陣對角線的兩端,因此,他們就無法直接交談了。幸運的是,他們可以通過傳紙條來進行交流。紙條要經(jīng)由許多同學(xué)傳到對方手里,小淵坐在矩陣的左上角,坐標(1,1),小軒坐在矩陣的右下角,坐標(m,n)。從小淵傳到小軒的紙條只可以向下或者向右傳遞,從小軒傳給小淵的紙條只可以向上或者向左傳遞。

在活動進行中,小淵希望給小軒傳遞一張紙條,同時希望小軒給他回復(fù)。班里每個同學(xué)都可以幫他們傳遞,但只會幫他們一次,也就是說如果此人在小淵遞給小軒紙條的時候幫忙,那么在小軒遞給小淵的時候就不會再幫忙。反之亦然。


還有一件事情需要注意,全班每個同學(xué)愿意幫忙的好感度有高有低(注意:小淵和小軒的好心程度沒有定義,輸入時用0表示),可以用一個0-1000的自然數(shù)來表示,數(shù)越大表示越好心。小淵和小軒希望盡可能找好心程度高的同學(xué)來幫忙傳紙條,即找到來回兩條傳遞路徑,使得這兩條路徑上同學(xué)的好心程度之和最大?,F(xiàn)在,請你幫助小淵和小軒找到這樣的兩條路徑。

輸入
第一行輸入N(0<N<100)表示待測數(shù)據(jù)組數(shù)。
每組測試數(shù)據(jù)輸入的第一行有2個用空格隔開的整數(shù)m和n,表示班里有m行n列(2<=m,n<=50)。
接下來的m行是一個m*n的矩陣,矩陣中第i行j列的整數(shù)表示坐在第i行j列的學(xué)生的好心程度(不大于1000)。每行的n個整數(shù)之間用空格隔開。
輸出
每組測試數(shù)據(jù)輸出共一行,包含一個整數(shù),表示來回兩條路上參與傳遞紙條的學(xué)生的好心程度之和的最大值。
樣例輸入
1 3 3 0 3 9 2 8 5 5 7 0
??????? ??????? 這道題剛開始的時候就想到用動態(tài)規(guī)劃的方法來做,以為只是兩次動態(tài)規(guī)劃,第二次動態(tài)規(guī)劃排除掉第一次走過的點而已。

????????? 但實現(xiàn)了單條道路的最大好感度和的計算之后,卻發(fā)現(xiàn)遠遠沒這么簡單,兩條道路如何不交叉是一個問題。

??????????? 發(fā)現(xiàn)可以用四維數(shù)組來動態(tài)規(guī)劃解決這道題。

????????? 設(shè)f[i][j][k][l]為從 (0, 0) 位置由兩條不交叉的線路走到 (i, j),(k, l) 位置時的最大好感度和,則它的上一步可能有四種情況:

???? ? ?? 第一個點由上走來,第二個點也由上走來,此時的好感度和為f[i - 1][j][k - 1][l] + a[i][j] + a[k][l]
??? ? ??? 第一個點由上走來,第二個點則由左走來,此時的好感度和為f[i - 1][j][k][l - 1] + a[i][j] + a[k][l],但此時應(yīng)考慮第一個點的上方的點是否會與第二個點的左方的點重合,如果重合則不可取
????????? 第一個點由左走來,第二個點則由上走來,此時的好感度和為f[i][j - 1][k - 1][l] + a[i][j] + a[k][l],但此時應(yīng)考慮第一個點的左方的點是否會與第二個點的上方的點重合,如果重合則不可取
????????? 第一個點由左走來,第二個點也由左走來,此時的好感度和為f[i][j - 1][k][l - 1] + a[i][j] + a[k][l]
取四種情況中的最大者即可。

????????? 仔細審題發(fā)現(xiàn)還可以優(yōu)化掉一維,因為第一張紙條走了k步時,第二張紙條也必然走了k步,因此我們只需枚舉紙條走了多少步和他的橫坐標即可知道縱坐標,dp[k][x1][x2]表示走到第k步,第一張紙條的位置x1,y1=k-x1+1;第二張紙條的位置x2,y2=k-x2+1;

?????????? 狀態(tài)轉(zhuǎn)移方程:dp[k][x1][x2] = MAX(dp[k-1][x1][x2], dp[k-1][x1][x2+1], dp[k-1][x1+1][x2], dp[k-1][x1+1][x2+1]) + Map[x1][y1] +? Map[x2][y2];

?????????? 第一種寫法:

#include <stdio.h> int n,m; int min(int a,int b){return a<b?a:b;} int max(int a,int b){return a>b?a:b;}int a[51][51]; int f[102][51][51];int main(){int t;scanf("%d", &t);while(t--){scanf("%d%d",&n,&m);for (int i=1;i<=n;i++)for (int j=1;j<=m;j++)scanf("%d",&a[i][j]);for (int i=1;i<m+n;i++){for (int x1=1;x1<=min(i,n);x1++){int y1=i-x1+1;if(y1>m) continue;for (int x2=x1+1;x2<=min(i,n);x2++){int y2=i-x2+1;int temp=0;temp=max(f[i-1][x1][x2],f[i-1][x1-1][x2-1]);temp=max(temp,f[i-1][x1-1][x2]);temp=max(temp,f[i-1][x1][x2-1]);f[i][x1][x2]=temp+a[x1][y1]+a[x2][y2];}}}int ans = 0;if(ans < f[m+n-2][n-1][n]) ans = f[m+n-2][n-1][n];if(ans < f[m+n-2][n][n-1]) ans = f[m+n-2][n][n-1];printf("%d\n",ans);}return 0; }

????????? 第二種寫法(滾動數(shù)組進一步優(yōu)化空間):

#include <iostream> #include <cstdio> #include <cstring>using namespace std;#define MAX(a, b) ((a) > (b) ? (a) : (b)) #define MAXN 51int matrix[MAXN][MAXN]; int dp[2][MAXN][MAXN]; ///滾動數(shù)組int MaxSum(int m, int n) {memset(dp, 0, sizeof(dp));int x1, y1, k, x2, y2; ///第一個紙條在(x1,y1)位置, 第二個紙條在(x2,y2)位置,紙條傳遞到第k個位置for (k = m+n-3; k > 0; k--){for (x1 = 0, y1 = k; x1 < m-1; x1++, y1--){if (y1 >= n) ///有人(可傳遞)才計算{continue;}for (x2 = x1+1, y2 = y1-1; x2 < m; x2++, y2--){dp[k%2][x1][x2] = matrix[x1][y1] + matrix[x2][y2];int r = (k+1) % 2;dp[k%2][x1][x2] +=MAX(MAX(dp[r][x1][x2], dp[r][x1][x2+1]), MAX(dp[r][x1+1][x2], dp[r][x1+1][x2+1]));///到1、2兩個紙條分別有兩種情況,共有2*2種}}}return dp[1][0][1]; }int main(void) {int ncases;scanf("%d", &ncases);while (ncases-- != 0){int m, n;scanf("%d%d", &m, &n);memset(matrix, 0, sizeof(matrix));int i, j;for (i = 0; i < m; i++){for (j = 0; j < n; j++){scanf("%d", &matrix[i][j]);}}printf("%d\n", MaxSum(m, n));}return 0; }



總結(jié)

以上是生活随笔為你收集整理的nyoj 61 传纸条(一) (双线动归)nyoj 探寻宝藏的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。