noi 2 6 8786 方格取數(DP)

2022-07-23 02:06:22 字數 990 閱讀 3023

題意:n*n的方格圖每格有乙個數值,要求從左上角每步往右或往下走到右下角,問走2次的最大和。

解法:走一次的很好想,而走2次,不可誤以為先找到最大和的路,再找剩下的最大和的路就是正解。而應該認清動態規劃的實質,定義為最佳解的狀態,因此要走的2次都要涵括。

o(n^4)——f[i][j][k][l]表示分別走到(i,j)和(k,l)的最大和。每次從上一步分別走(下,下),(右,右),(右,下),(下,右)的狀態推導就好了。f[i][j][k][l]=max(f[i-1][j][k-1][l],f[i][j-1][k][l-1],f[i][j-1][k-1][l],f[i-1][j][k][l-1])+a[i][j]+a[k][l]-((i==j&&k==l)?a[k][l]:0);

這樣定義感覺很累贅,表示的是2次分別走可相同或不相同步數到相應座標的狀態。可以用同時走k步來定義狀態,而且仔細想想,我們可以進一步思考出:由於只能往下和往右走,那麼我們根據走到的座標就可以知道總共和向下、向右各走了幾步。反之,若已知總步數和向右走了幾步,座標也是可以知道的了。

注意——不能重複算同一格上的數。

1 #include2 #include3 #include4 #include5

using

namespace

std;67

int a[12][12],f[24][12][12];8

int mmax(int x,int y)

9int mmin(int x,int y)

10int

main()

1122 memset(f,0,sizeof

(f));

23for (int k=1;k<=2*n;k++)

24for (int i=1;i<=k;i++)

25for (int j=1;j<=k;j++)

2636 printf("

%d",f[2*n][n][n]);

37return0;

38 }

OpenJudge P8786 方格取數 DP

總時間限制 1000ms 記憶體限制 65536kb 描述 設有n n的方格圖 n 10 我們將其中的某些方格中填入正整數,而其他的方格中則放入數字0。如下圖所示 見樣例 某人從圖的左上角的a 點出發,可以向下行走,也可以向右走,直到到達右下角的b點。在走過的路上,他可以取走方格中的數 取走後的方格...

NOIP2000方格取數 DP

設有n n的方格圖 n 9 我們將其中的某些方格中填入正整數,而其他的方格中則放 人數字0。如下圖所示 見樣例 a 0 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 ...

Noip 2000 方格取數 dp

題解 本題主要考查動態規劃。簡要題意 有n n n nn n的方格圖,在某些方格中填入正整數,1,1 1,1 1,1 到 n,n n,n n,n 共走兩次,找出2條這樣的路徑,走過的方格中將變為0,使得取得的數之和為最大 1.動態規劃 因為本題資料規模小,可直接四維dp求 如下 include in...