問題描述
設有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...