摘花生(dp入門)

摘花生
總時間限制: 1000ms 內存限制: 65536kB
描述
Hello Kitty 想摘點花生送給她喜歡的米老鼠。她來到一片有網格狀道路的矩形花生地(如下圖),從西北角進去,東南角出來。地裏每個道路的交叉點上都有種着一株花生苗,上面有若干顆花生,經過一株花生苗就能摘走該它上面所有的花生。Hello Kitty只能向東或向南走,不能向西或向北走。問Hello Kitty 最多能夠摘到多少顆花生。
輸入
第一行是一個整數T,代表一共有多少組數據。1<=T <= 100
接下來是T組數據。
每組數據的第一行是兩個整數,分別代表花生苗的行數R和列數 C ( 1<= R,C <=100)
每組數據的接下來R行數據,從北向南依次描述每行花生苗的情況。每行數據有 C 個整數,按從西向東的順序描述了該行每株花生苗上的花生數目 M ( 0<= M <= 1000)。
輸出
對每組輸入數據,輸出一行,內容爲Hello Kitty能摘到得最多的花生顆數。
樣例輸入

2
2 2
1 1
3 4
2 3
2 3 4
1 6 5

樣例輸出

8
16

思路點拔:本題是經典的動態規劃,就是和數字三角形那道題有點相似,我們的狀態轉移方程也很簡單,就是dp[i][j]+=max{dp[i-1][j],dp[i][j-1]}(i>1&&j>1)狀態轉移方程也很好理解,就是比較是走下面划算還是走右邊划算,然後,注意討論兩個邊界條件,最後輸出終點對應的值就A了~
上代碼!!

#include<cstdio>
#include<iostream>
using namespace std;
int a[105][105];
int main()
{
    int k,n,m;
    scanf("%d",&k); //輸入k表示有k組數據
    for(int i=1;i<=k;i++) 
    {
        scanf("%d %d",&m,&n); //輸入m,n表示花生地的大小
        for(int i=1;i<=m;i++)
            for(int j=1;j<=n;j++)
                scanf("%d",&a[i][j]); //輸入每個單元有多少花生
        for(int i=1;i<=m;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(i==1) a[i][j]+=a[i][j-1]; 
                //邊界條件1,就是考慮第一行的情況,就是隻能由左邊的數得到
                else if(j==1) a[i][j]+=a[i-1][j];
                //邊界條件2,就是考慮的一列的情況,就是隻能由上面的數得到
                    else a[i][j]+=max(a[i-1][j],a[i][j-1]); //正常情況
            }
        }
        printf("%d\n",a[m][n]); //輸出解
    }
    return 0;
} 
//一個簡單的dp就結束啦!!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章