日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【动态规划】方格取数 (ssl 1010)

發布時間:2023/12/3 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【动态规划】方格取数 (ssl 1010) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

方格取數方格取數

Description

設有N*N的方格圖(N<=10,我們將其中的某些方格中填入正整數,而其他的方格中則放入數字0。如下圖所示(見樣例):

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

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

Input

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

Output

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

Sample Input

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

Sample Output

67

題目大意:

有兩個士兵,從1,1走到n,n路上有許多money,但他們只能往下或往右走,他們最多能得到多少money

解題方法:

用四位數組表示兩個士兵的位置,詳情請見動態轉移方程:

動態轉移方程:

f[i][j][i1][j1]=max{l+a[i][j](i==i1)and(j==j1)l+a[i][j]+a[i1][j1]elsef[i][j][i1][j1]=max\left\{\begin{matrix}l+a[i][j]&amp;(i==i1)and(j==j1)\\ l+a[i][j]+a[i1][j1]&amp;else\end{matrix}\right.f[i][j][i1][j1]=max{l+a[i][j]l+a[i][j]+a[i1][j1]?(i==i1)and(j==j1)else?

標注:

ij分別為第一個士兵的行列,i1j1分別為第二個士兵的行列,l為上一步最大的,第一行是因為重復了,金幣只能拿一份,第二行是兩個士兵那兩份

#include<cstdio> #include<iostream> using namespace std; int n,x,y,d,a[12][12],f[12][12][12][12]; int main() {scanf("%d%d%d%d",&n,&x,&y,&d);while (!((x==0)&&(y==0)&&(d==0)))//判斷結束為{a[x][y]=d;//放進圖中scanf("%d%d%d",&x,&y,&d);}for (int i=1;i<=n;i++)//士兵一的行for (int j=1;j<=n;j++)//士兵一的列for (int i1=1;i1<=n;i1++)//士兵二的行for (int j1=1;j1<=n;j1++)//士兵二的列{x=max(f[i-1][j][i1-1][j1],f[i][j-1][i1][j1-1]);//分別為上上,左左(這要倒著)y=max(f[i-1][j][i1][j1-1],f[i][j-1][i1-1][j1]);//分別為上左,左上if ((i==i1)&&(j==j1)) f[i][j][i1][j1]=max(x,y)+a[i][j];//重復,先把x,y合并,再加當前格子的金幣else f[i][j][i1][j1]=max(x,y)+a[i][j]+a[i1][j1];//要加兩遍}printf("%d",f[n][n][n][n]);//輸出兩位士兵都到n,n時的結果 }

提示:

本體的相似題:傳紙條(ssl 1589)因太相似就不寫了

總結

以上是生活随笔為你收集整理的【动态规划】方格取数 (ssl 1010)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。