矩形內的遞推dp

2022-06-27 03:39:09 字數 1322 閱讀 2806

黑妹和黑弟又聚在一起玩遊戲了,這次他們選擇在乙個n*m的棋盤上玩遊戲,棋盤上的每個方格都有乙個非負的分數,

遊戲從左上角開始右下角結束,雙方交替的選擇乙個方格並獲得方格上相應的分數,一方選擇的方格必須在上一步另一方選擇的方格

的右邊或者下面,黑妹先開始。現在黑妹想知道,如果雙方都採取最優策略(最優策略是指雙方都希望最終自己的總分數減去對方的總分數最大),她的總分數減去黑弟的總分數會是多少?

第一行乙個整數t表示資料的組數。(1 ≤ t ≤ 20)

對於每組資料:

第一行兩個整數n,m表示棋盤的規格。(1 ≤ n, m ≤ 500)

接下來n行每行m個整數aij表示方格對應的分數。(

)
對於每組資料輸出一行表示答案。
示例1

複製

1 

2 2

1 3

4 5

複製

2

思路分析 : 兩個方向,第乙個是考慮記憶化的搜尋,對於乙個位置很容易判斷出來,他是先走的人走的還是後走的人走的,先走的人下乙個位置一定是選小的,後走的人下一步一定是選大的。

**示例:

const int inf = 0x3f3f3f3f;

int n, m;

int mp[505][505];

int dp[505][505];

int dfs(int x, int y)

else }

int main()

}//memset(dp, inf, sizeof(dp));

int ans = dfs(1, 1);

printf("%d\n", ans);

//printf("+++ %d %d %d %d \n", dp[1][1], dp[1][2], dp[2][1], dp[2][2]);

}return 0;

}

思路二 :考慮dp

dp[i][j]表示以 i, j 為起點到達終點的答案的最大值,但是要注意的是從終點往回去推

**示例:

const int inf = 0x3f3f3f3f;

int n, m;

int mp[505][505];

int dp[505][505];

int main()

}//memset(dp, 0, sizeof(dp));

for(int i = n; i >= 1; i--)}}

printf("%d\n", dp[1][1]);

}return 0;

}

遞推DP 加深

zoj 3747 題意 給n個士兵排隊,每個士兵三種g r p可選,求至少有m個連續g士兵,最多有k個連續r士兵的排列的種數。都轉化為至多的士兵連續的個數。令集合a 集合b c a b 在轉化要如何求 至多x個g士兵連續,至多y個士兵連續 dp i 0 至多i個g 的方案數 dp i 1 至多i個r...

矩形巢狀 DP

原先沒看出來,後來發現和議題很像,都是胴體規劃,那題是給你一些點的座標,找到最多的點連成的顯示單調的 include includestruct asd ju 1010 int cmp const void a,const void b int qian int j,int i void sol i...

矩形巢狀(DP)

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 有n個矩形,每個矩形可以用a,b來描述,表示長和寬。矩形x a,b 可以巢狀在矩形y c,d 中當且僅當a 輸入 第一行是乙個正正數n 0輸出 每組測試資料都輸出乙個數,表示最多符合條件的矩形數目,每組輸出佔一行 樣例輸入 1 ...