【九度】题目1529:棋盘寻宝

题目1529:棋盘寻宝
时间限制:1 秒内存限制:128 兆特殊判题:否提交:695解决:313
题目描述:
现在有一个8*8的棋盘,上面放着64个价值不等的礼物,每个小的棋盘上面放置一个礼物(礼物的价值大于0小于1000),一个人的初始位置在棋盘的左上角,每次他只能向下或向右移动一步,并拿走对应棋盘上的礼物,结束位置在棋盘的右下角,请设计一个算法使其能够获得最大价值的礼物。
输入:
输入包含多个测试用例,每个测试用例共有8行8列,第i行的第j列的数字代表了该处棋盘上的礼物的价值,每两个数之间用空格隔开。
输出:
对于每组测试用例,请输出你能够获得最大价值的礼物。
样例输入:
2 8 15 1 10 5 19 19
3 5 6 6 2 8 2 12
16 3 8 17 12 5 3 14
13 3 2 17 19 16 8 7
12 19 10 13 8 20 16 15
4 12 3 14 14 5 2 12
14 9 8 5 3 18 18 20
4 2 10 19 17 16 11 3
样例输出:
194
来源:
微策略2012年校园招聘笔试题
【解题思路】
简单dp,每次只能往右或者往下走。
当在首行时,上一步走到当前步,只能是右走。因此当前拿到礼物的最大价值是前一列拿到礼物的值加上当前礼物的值。
dp[i][j] = dp[i][j-1] + array[i][j];
当在首列时,上一步走到当前步,只能是下走。因此当前拿到礼物的最大价值是前一行拿到礼物的值加上当前礼物的值。
dp[i][j] = dp[i-1][j] + array[i][j];
在其他位置,可以往下或者往右,因此最大值为
dp[i][j] = max(dp[i-1][j], dp[i][j-1])+array[i][j];

Java AC

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
 
public class Main {
    /*
     * 2014年5月8日 14:03:05
     */
    public static void main(String[] args) throws Exception{
        StreamTokenizer st = new StreamTokenizer(new BufferedReader(
                new InputStreamReader(System.in)));
        while (st.nextToken() != StreamTokenizer.TT_EOF) {
            int len = 8;
            int array[][] = new int[len][len];
            array[0][0] = (int)st.nval;
            for (int i = 0; i < len; i++) {
                for (int j = 0; j < len; j++) {
                    if (i == 0 && j == 0) {
                        continue;
                    }
                    st.nextToken();
                    array[i][j] = (int)st.nval;
                }
            }
            int dp[][] = new int[len][len];
            for (int i = 0; i < len; i++) {
                for (int j = 0; j < len; j++) {
                    if (i == 0 && j == 0) {
                        dp[i][j] = array[i][j]; 
                    }else if (i == 0) {
                        dp[i][j] = dp[i][j-1] + array[i][j];
                    }else if (j == 0) {
                        dp[i][j] = dp[i-1][j] + array[i][j];
                    }else {
                        dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1])+array[i][j];
                    }
                }
            }
            System.out.println(dp[7][7]);
        }
    }
}
/**************************************************************
    Problem: 1529
    User: wangzhenqing
    Language: Java
    Result: Accepted
    Time:340 ms
    Memory:14748 kb
****************************************************************/
C++ AC

#include<stdio.h>
#include<string.h>
const int len = 8;
int array[len][len];
int dp[len][len];
int i, j;
 
int max(int a,int b){
    return a > b ? a : b;
}
 
int main(){
    while(scanf("%d",&array[0][0]) != EOF){
        memset(dp, 0, sizeof(dp));
        for (i = 0; i < len; i++) {
            for (j = 0; j < len; j++) {
                if (i == 0 && j == 0) {
                    continue;
                }
                scanf("%d",&array[i][j]);
            }
        }
        for (int i = 0; i < len; i++) {
            for (int j = 0; j < len; j++) {
                if (i == 0 && j == 0) {
                    dp[i][j] = array[i][j]; 
                }else if (i == 0) {
                    dp[i][j] = dp[i][j-1] + array[i][j];
                }else if (j == 0) {
                    dp[i][j] = dp[i-1][j] + array[i][j];
                }else {
                    dp[i][j] = max(dp[i-1][j], dp[i][j-1])+array[i][j];
                }
            }
        }
        printf("%d\n", dp[7][7]);
    }
    return 0;
}
 
/**************************************************************
    Problem: 1529
    User: wangzhenqing
    Language: C++
    Result: Accepted
    Time:0 ms
    Memory:1020 kb
****************************************************************/


你可能感兴趣的:(【九度】题目1529:棋盘寻宝)