FJUT 1735 开宝箱
FJUT 1735
開寶箱
你確定我是來開寶箱不是來比賽的嗎??艾瑪,這是哪,天啊,倫家竟然穿越了。
擺在眼前的是1個n*m(0< n<=100&&0< m<=100)的寶箱矩陣,而你就在這個矩陣的左上角也就是入口處。沖啊,開寶箱去,然而腳不聽話啊,你的腳失去了向左走與向上走(方向是相對于整個地圖,換句話說不是通過你臉的朝向來決定方向,你只能↓和→)的能力。(你:這設定真奇怪啊 。WGX大神:讓你四處走還不把我的寶箱全開了)。
不管了開寶箱要緊。假設每個寶箱有一個數字V,如果是正數那么你獲得V個金幣,如果是負數,哈哈,不好意思,扣去相應個金幣。(哭暈在廁所)。
那么問題來了:
如果你在已知寶箱的獎勵的情況下,請選擇一條路線,這條路線能讓你獲得最多的金幣,當然所有走過的寶箱必須打開,不能說因為是負數你就選擇不去打開它,并且出口(左上)和入口(右下)的那兩個寶箱是必經點,也必須打開。
你的任務只是求出該路線獲得的金幣值就行。如下圖,我們只要輸出19就行。
Input
第一行輸入一個正整數T代表有T組數據,接下來有T組數據
對于每組數據,第一行輸入兩個正整數n 和m(n為行數m為列數)接下來是n行數據,每行數據有m個V,且V為整型,分別對應每個寶箱的獲獎情況(-200<=V<=200)。
Output
對于每組數據輸出一個整數,代表所能獲得的最大金幣值。
SampleInput
2
4 4
1 2 -9 8
-5 5 7 3
10 1 1 2
6 5 8 -6
3 5
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
SampleOutput
19
7
從左上角開始,到右下角出去,求經過路線的和的最大值。。。又是一道dp題。。。找到初始狀態,狀態轉移,還有最后的結果位置,弄清楚這些,分分鐘就可以AC了。
首先找三個步驟中最關鍵的一步狀態轉移:每一次只能向下或者向右,那么就有了下面的狀態轉移方程:
dp[i] [j]= max( dp[i-1] [j], dp[i] [j-1])+a[i] [j];
就是根據移動 反推即可。當前的最優解就是上一步的最優解加上這一步的數據,所有子問題達到最優就能實現整體最優。。
當然這里注意下三點
1、讓數組的i j 都從1開始輸入,因為有個dp[i-1] [j-1] 防止下標小于0的情況
2、每一格的范圍-200到200 所以讓dp 【i】【j】初始化為小于-200的數值.
3、 i=j=1的時候特判一下dp的值
代碼參考如下:
#include<stdio.h> int max(int a,int b) { return a>b?a:b; } int b[101][101]; int f[101][101]; int main() {int t;scanf("%d",&t);while(t--){int n,m,i,j,k,kk;scanf("%d%d",&n,&m);for(i=0;i<=n+1;i++){for(j=0;j<=m+1;j++)f[i][j]=-201;}for(i=1;i<=n;i++){for(j=1;j<=m;j++)scanf("%d",&b[i][j]);}for(i=1;i<=n;i++){for(j=1;j<=m;j++){if(i==1 && j==1)f[1][1]=b[1][1];elsef[i][j]=max(f[i-1][j],f[i][j-1])+b[i][j];}}printf("%d\n",f[n][m]);}return 0; }總結
以上是生活随笔為你收集整理的FJUT 1735 开宝箱的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Proxmox VE 7.2 更改登录横
- 下一篇: 黑客攻击入门:DNS欺骗、ARP攻击和钓