程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> NYOJ 171 聰明的kk

NYOJ 171 聰明的kk

編輯:C++入門知識

點擊打開鏈接NYOJ 171
1題目:
                                                                                 聰明的kk
描述
    非洲某國展館的設計靈感源於富有傳奇色彩的沙漠中陡然起伏的沙丘,體現出本國不斷變換和絢麗多彩的自然風光與城市風貌。展館由五部分組成,館內影院播放名為《一眨眼的瞬間》的寬銀幕短片,反映了建國以來人民生活水平和城市居住環境的驚人巨變。
    可移動“沙丘”變戲法 的靈感源於其獨特而雄偉的自然景觀——富於傳奇色彩的險峻沙丘。宏偉的結構、可循環的建材,與大自然相得益彰。環繞一周,發現它正是從沙丘那不斷變換的形態中汲取靈感的。外形逼真到無論從哪個角度去觀察,都能清楚地辨識出沙丘的特征。
    它“坡面”高達20米,微風吹來,你是否感覺到沙的流動?用手去觸碰,卻發現原來是“魔術戲法”。它表面的不銹鋼面板呈現出一種富於變幻的色彩,從不同角度觀察,呈現不同色澤,由此來模仿流動沙丘的光感。
    走進第三展廳有一個超大的屏幕,通過奇妙的特效,讓觀眾猶如親身來到浩瀚的沙漠。更為奇妙的是,只見一個小動物“KK”正從沙漠區域(矩形)的左上角沿著向右或向下的方向往右下角跑去。KK太聰明了,它居然能在跑的過程中會選擇吃掉盡可能多的蟲子線路。
    你知道它吃掉多少蟲子嗎?

輸入
    第一行:N M (1≤N M≤20 0≤Xij≤500(i=1,2„.N, j=1,2„,M)
    )表示沙漠是一個N*M的矩形區域
    接下來有N行:每行有M個正整數,Xi1 Xi2 ……Xim 表示各位置中的蟲子數(單個空格隔開)
    假設“KK”只能向右走或向下走。
輸出
    輸出有一個整數, 表示“KK”吃掉最多的蟲子數。
樣例輸入

    3 4
    3 1 2 8
    5 3 4 6
    1 0 2 3
樣例輸出
    24

2思路:DP(最大的路徑和)
3分析:假設當前的位置在G[i][j],那麼根據kk只能往右和往下,那麼我們知道G[i][j]的上一步來自G[i-1][j]和G[i][j-1],那麼我們假設dp[i][j]為到達G[i][j]的最大值,那麼有dp[i][j] = max(dp[i-1][j] , dp[i][j-1])+G[i][j];所以只要去對每一個位置進行推到,那麼最後的ans就是dp[n][m](這裡為了計算方便,把下標從1開始)

4代碼:
[cpp] 
#include <algorithm>   
#include <iostream>  
#include <cstring> 
#include <cstdio> 
using namespace std; 
#define MAXN 30 
#define INF -0xFFFFFFF 
 
int n , m; 
int G[MAXN][MAXN]; 
int dp[MAXN][MAXN]; 
 
int max(int a , int b){ 
    return a>b?a:b; 

 
void solve() { 
    int i , j; 
    memset(dp , 0 , sizeof(dp));     
    for(i = 1 ; i <= n ; i++){ 
        for(j = 1 ; j <= m ; j++) 
            dp[i][j] = max(dp[i-1][j] , dp[i][j-1])+G[i][j]; 
    } 
    printf("%d\n" , dp[n][m]); 

 
int main() { 
    //freopen("input.txt", "r", stdin); 
    while(scanf("%d%d%*c" , &n , &m) != EOF){ 
        for(int i = 0 ; i <= n ; i++) G[i][0] = INF; 
        for(int i = 0 ; i <= m ; i++) G[0][i] = INF; 
        for(int i = 1 ; i <= n ; i++){ 
            for(int j = 1 ; j <= m ; j++) 
                scanf("%d" , &G[i][j]); 
        } 
        solve(); 
    } 
    return 0; 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved