您的位置:首页 > 其它

聪明的kk(nyoj 171)

2014-02-20 13:49 417 查看

聪明的kk

时间限制:1000 ms | 内存限制:65535 KB

难度:3
描述

………………(省略)小动物“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


状态转移方程:dp[ i ] [ j ] = a[ i ] [ j ] + max(dp[ i ] [ j - 1], dp[ i - 1 ][ j ] )

#include <stdio.h>

int a[25][25];
int dp[25][25];

int max(int i, int j)
{
return i > j ? i : j;
}

int main (void)
{
int x, y, i, j;
while(scanf("%d %d", &x, &y) != EOF)
{
for(i = 0; i < x; i++)
for(j = 0; j < y; j++)
scanf("%d", &a[i][j]);

dp[0][0] = a[0][0];
for(i = 0; i < x; i++)
{
for(j = 0; j < y; j++)
{
if(i - 1 >= 0 && j - 1 >= 0)
dp[i][j] = a[i][j] + max(dp[i][j - 1], dp[i - 1][j]);
else if(i - 1 < 0)
dp[i][j] = a[i][j] + dp[i][j - 1];
else if(j - 1 < 0)
dp[i][j] = a[i][j] + dp[i - 1][j];
}
}
printf("%d\n", dp[x - 1][y - 1]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: