牛客網__金幣餡餅

鏈接:https://ac.nowcoder.com/acm/contest/984/K
來源:牛客網
 

時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 32768K,其他語言65536K
64bit IO Format: %lld

題目描述

最近,奶牛們熱衷於把金幣包在麪粉裏,然後把它們烤成餡餅。第i塊餡餅中含有Ni(1<=Ni<=25)塊金幣,並且,這個數字被醒目地標記在餡餅表面。
奶牛們把所有烤好的餡餅在草地上排成了一個R行(1<=R<=100)C列(1<=C<=100)的矩陣。你現在站在座標爲(1,1)的餡餅邊上,當然,你可以拿到那塊餡餅裏的所有金幣。你必須從現在的位置,走到草地的另一邊,在座標爲(R,C)的餡餅旁邊停止走動。每做一次移動,你必須走到下一列的某塊餡餅旁邊,並且,行數的變動不能超過1(也就是說,如果現在你站在座標爲(r,c)的餡餅邊上,下一步你可以走到座標爲(r-1,c+1),(r,c+1),或者(r+1,c+1)的餡餅旁邊)。當你從一塊餡餅邊經過,你就可以拿走餡餅裏所有的金幣。當然啦,你一定不會願意因半路離開草地而失去唾手可得的金幣,但,最終你一定得停在座標爲(R,C)的餡餅旁邊。

現在,你拿到了一張標記着餡餅矩陣中,每一塊餡餅含金幣數量的表格。那麼,按照規則,你最多可以拿到多少金幣呢?

比方說,奶牛們把餡餅排成如下的矩陣,矩陣中的數字表示該位置的餡餅中含金幣的數量:

起點-> 6 5 3 7 9 2 7
    2 4 3 5 6 8 6
    4 9 9 9 1 5 8 <-終點
以下是一條合法的路線:

起點-> 6 5 3 7 9 2 7
     \
    2 4 3 5 6 8 6
       \   / \
    4 9 9-9 1 5-8 <-終點
按上述的路線進行走動,一共可以獲得6+4+9+9+6+5+8=47個金幣。按照規則,在這個矩陣中最多可以得到50個金幣,路線如下圖所示:

起點-> 6 5 3 7 9 2 7
     \
    2 4 3 5 6-8 6
       \   /   \
    4 9 9-9 1 5 8 <-終點

(請複製到記事本中用等寬字體查看)

 

輸入描述:

第1行: 兩個用空格隔開的整數,R和C
第2..R+1行: 每行包含C個用空格隔開的正整數,依次表示一行中從左往右各個餡餅裏金幣的數量

輸出描述:

第1行: 輸出一個正整數,表示你所能收集到的最大金幣數目

示例1

輸入

複製

3 7
6 5 3 7 9 2 7
2 4 3 5 6 8 6
4 9 9 9 1 5 8

輸出

複製

50

簡單的bfs

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef pair<int,int>P;

const int maxn = 2e6+9;
const int mod = 1e9+7;
const int INF = 0x3f3f3f3f;

int a[109][109];
int dis[109][109];
int n,m;
void bfs(int x,int y){
    queue<P>que;
    dis[x][y]=a[x][y];
    que.push(P(x,y));
    while(!que.empty()){
        P p=que.front();   que.pop();
        int u=p.first,v=p.second;
        if(v<=m){
            if(!dis[u][v+1])que.push(P(u,v+1));
            dis[u][v+1]=max(dis[u][v+1],dis[u][v]+a[u][v+1]);
            if(u<n){
                if(!dis[u+1][v+1])que.push(P(u+1,v+1));
                dis[u+1][v+1]=max(dis[u+1][v+1],dis[u][v]+a[u+1][v+1]);
            }
            if(u>1){
                if(!dis[u-1][v+1])que.push(P(u-1,v+1));
                dis[u-1][v+1]=max(dis[u-1][v+1],dis[u][v]+a[u-1][v+1]);
            }
        }
    }
}

int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            scanf("%d",&a[i][j]);
        }
    }
    bfs(1,1);
//    for(int i=1;i<=n;i++){
//        for(int j=1;j<=m;j++){
//            cout<<dis[i][j]<<" ";
//        }
//        cout<<endl;
//    }
    printf("%d\n",dis[n][m]);
    return 0;
}







 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章