方格取數 藍橋杯

2021-06-28 18:36:09 字數 1028 閱讀 6476

問題描述

設有n*n的方格圖(n<=10),我們將其中的某些方格中填入正整數,而其他的方格中則放入數字0。

某人從圖的左上角的a 點(1,1)出發,可以向下行走,也可以向右走,直到到達右下角的b點(n,n)。在走過的路上,他可以取走方格中的數(取走後的方格中將變為數字0)。

此人從a點到b 點共走兩次,試找出2條這樣的路徑,使得取得的數之和為最大。

輸入格式

輸入的第一行為乙個整數n(表示n*n的方格圖),接下來的每行有三個整數,前兩個表示位置,第三個數為該位置上所放的數。一行單獨的0表示輸入結束。

輸出格式

只需輸出乙個整數,表示2條路徑上取得的最大的和。

樣例輸入8

2 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

樣例輸出

67解題思路:

多執行緒同時dp。當做倆個人同時在矩陣中走;

i1,j1,表示第乙個人的位置;

i2,j2,表示第二個人的位置;

dp[i1][j1][i2][j2]表示倆個人在對應的方格中時候取得的最大的數;

到達i1,j1有(i1-1,j1)(i1,j1-1)倆種狀態;

到達i2,j2有(i2-1,j2)(i2,j2-1)倆種狀態;

因此dp[i1][j1][i2][j2]就是這四種dp裡的最大值加上對應maze[i1][j1],maze[i2][j2]中的值即可,但是,要注意,如果倆個人站在同乙個位置,則只加乙個maze即可,因為乙個人取走後該位置就變為0了。

#include#include#include#include#includeusing namespace std;

int main()

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

for(int i1=1;i1<=n;i1++)

}} }

cout<}

藍橋杯 方格取數

設有n n的方格圖 n 10 我們將其中的某些方格中填入正整數,而其他的方格中則放入數字0。某人從圖的左上角的a 點 1,1 出發,可以向下行走,也可以向右走,直到到達右下角的b點 n,n 在走過的路上,他可以取走方格中的數 取走後的方格中將變為數字0 此人從a點到b 點共走兩次,試找出2條這樣的路...

藍橋杯 方格取數 (多執行緒DP)

演算法訓練 方格取數 時間限制 1.0s 記憶體限制 256.0mb 問題描述 設有n n的方格圖 n 10 我們將其中的某些方格中填入正整數,而其他的方格中則放入數字0。某人從圖的左上角的a 點 1,1 出發,可以向下行走,也可以向右走,直到到達右下角的b點 n,n 在走過的路上,他可以取走方格中...

藍橋杯 方格填數

方格填數 如下的10個格仔 如果顯示有問題,也可以參看 圖1.jpg 填入0 9的數字。要求 連續的兩個數字不能相鄰。左右 上下 對角都算相鄰 一共有多少種可能的填數方案?請填寫表示方案數目的整數。注意 你提交的應該是乙個整數,不要填寫任何多餘的內容或說明性文字。include include in...