[藍橋杯][演算法訓練VIP]方格取數
題目描述
設有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
題解一 :記憶化搜尋
可以轉化為兩個人同時由A點走向B點所取得的最大的和。
dp[xi][yi][xj][yj]表示:其中一個人由(xi,yi)到B點,另一個人由(xj,yj)到B點所取得的最大的和。
AC程式碼:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <map> #include <set> #include <stack> #include <queue> #include <vector> #include <string> #define cla(a, sum) memset(a, sum, sizeof(a)) #define rap(i, m, n) for(int i=m; i<=n; i++) #define rep(i, m, n) for(int i=m; i>=n; i--) #define bug printf("???\n") using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int, int> P; typedef pair<ll, ll> Pl; const int Inf = 0x3f3f3f3f; const double eps = 1e-8; const int mod=998244353; const int maxn = 3e4; const int N=1e5; template <typename T> void read(T &x){ x = 0; int f = 1; char ch = getchar(); while (!isdigit(ch)) {if (ch == '-') f = -1; ch = getchar();} while (isdigit(ch)) {x = x * 10 + ch - '0'; ch = getchar();} x *= f; } int n; int a[15][15]={0}; int dp[15][15][15][15]; int dfs(int xi,int yi,int xj,int yj){ if(xi<1||xi>n||yi>n||yi<1||xj<1||xj>n||yj<1||yj>n) return 0; if(xi==n&&yi==n&&xj==n&&yj==n)return a[xi][yi]; if(dp[xi][yi][xj][yj]!=-1)return dp[xi][yi][xj][yj];//剪枝 int t=a[xi][yi]; if(xi!=xj||yi!=yj)t+=a[xj][yj];//兩個人在不同點 int x=0; //兩個人有四種走法 x=max(x,dfs(xi+1,yi,xj+1,yj)); x=max(x,dfs(xi+1,yi,xj,yj+1)); x=max(x,dfs(xi,yi+1,xj+1,yj)); x=max(x,dfs(xi,yi+1,xj,yj+1)); dp[xi][yi][xj][yj]=x+t;//更新值 return dp[xi][yi][xj][yj]; } int main() { //ios::sync_with_stdio(false),cin.tie(0); read(n); int x,y,d; while(~scanf("%d%d%d",&x,&y,&d)&&(x||y||d)){ a[x][y]=d; } cla(dp,-1); printf("%d",dfs(1,1,1,1)); return 0; }
相關文章
- 藍橋杯—演算法訓練演算法
- 藍橋杯--演算法訓練演算法
- 藍橋杯 (java)演算法訓練 數對Java演算法
- [藍橋杯][演算法提高VIP]大數加法演算法
- 演算法訓練 字首表示式 (藍橋杯)演算法
- 藍橋杯 演算法訓練 K好數(Java解題)演算法Java
- [Java] 藍橋杯ALGO-117 演算法訓練 友好數JavaGo演算法
- 藍橋杯:入門訓練 Fibonacci數列
- 藍橋杯 演算法訓練 素因子去重(Java)演算法Java
- 藍橋杯 演算法訓練 操作格子 (線段樹)演算法
- [藍橋杯][基礎練習VIP]矩形面積交
- [藍橋杯][演算法提高VIP]尤拉函式演算法函式
- [藍橋杯][演算法提高VIP]超級瑪麗演算法
- 藍橋杯 演算法訓練 區間k大數查詢 (Java解題)演算法Java
- [藍橋杯][演算法提高VIP]奪寶奇兵 dp演算法
- 問題 1462: [藍橋杯][基礎練習VIP]Huffuman樹
- [藍橋杯][演算法提高VIP]分蘋果 線段樹演算法蘋果
- 藍橋杯訓練--母牛的故事(很清晰的思路)
- 發現一個可以練習藍橋杯VIP題目的網址
- 藍橋杯:基礎練習 查詢整數
- 藍橋杯 【基礎練習】 特殊迴文數
- 題目 1501: [藍橋杯][演算法提高VIP]分蘋果演算法蘋果
- 藍橋杯-帶分數
- 藍橋杯-地宮取寶
- [藍橋杯][演算法提高VIP]最大乘積 貪心 雙指標演算法指標
- 藍橋杯試題 基礎練習 特殊迴文數
- 藍橋杯-波動數列
- 藍橋杯-合併數列
- 藍橋杯-奪冠概率模擬(取隨機數)隨機
- 藍橋杯練習系統題目集
- 藍橋杯-買不到的數目
- 藍橋杯-連號區間數
- 藍橋杯 排序排序
- 2016 藍橋杯省賽C語言B組 第六題 方格填數C語言
- 藍橋杯基礎練習-找出唯一成對的數
- Java實現 藍橋杯 演算法提高 八數碼(BFS)Java演算法
- 藍橋杯演算法提高——字串匹配(Java)演算法字串匹配Java
- 藍橋杯 演算法提高 字串壓縮演算法字串