【DP入门】聪明的kk
2017-02-10 16:28
162 查看
题目来自nyist第171题,如下:
描述
聪明的“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”吃掉最多的虫子数。
经典递推,dp[i][j] = max ( dp[i][j-1],dp[i-1][j] ) + dp[i][j], 适于初学练手。
代码如下:#include <stdio.h>
#define max(a,b) (a>b?a:b)
int dp[20][20];
int main()
{
int i,j,N,M;
scanf("%d %d",&N,&M);
for(i = 0;i < N;i++)
for(j = 0;j < M;j++)
scanf("%d",&(dp[i][j]));
for(i = 0;i < N;i++)
for(j = 0;j < M;j++)
{
if(i == 0 && j == 0) continue;
else if(i == 0) dp[i][j] = dp[i][j] + dp[i][j-1];
else if(j == 0) dp[i][j] = dp[i][j] + dp[i-1][j];
else dp[i][j] = max(dp[i][j-1],dp[i-1][j]) + dp[i][j];
}
printf("%d ",dp[i-1][j-1]);
}
有一点,#define中一定要打括号,不然会变成
else (dp[i][j] = max(dp[i][j-1],dp[i-1][j]) ) + dp[i][j];导致出错。
描述
聪明的“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”吃掉最多的虫子数。
经典递推,dp[i][j] = max ( dp[i][j-1],dp[i-1][j] ) + dp[i][j], 适于初学练手。
代码如下:#include <stdio.h>
#define max(a,b) (a>b?a:b)
int dp[20][20];
int main()
{
int i,j,N,M;
scanf("%d %d",&N,&M);
for(i = 0;i < N;i++)
for(j = 0;j < M;j++)
scanf("%d",&(dp[i][j]));
for(i = 0;i < N;i++)
for(j = 0;j < M;j++)
{
if(i == 0 && j == 0) continue;
else if(i == 0) dp[i][j] = dp[i][j] + dp[i][j-1];
else if(j == 0) dp[i][j] = dp[i][j] + dp[i-1][j];
else dp[i][j] = max(dp[i][j-1],dp[i-1][j]) + dp[i][j];
}
printf("%d ",dp[i-1][j-1]);
}
有一点,#define中一定要打括号,不然会变成
else (dp[i][j] = max(dp[i][j-1],dp[i-1][j]) ) + dp[i][j];导致出错。
相关文章推荐
- NYOJ - 聪明的kk (dp)
- nyoj171聪明的KK(dp动态规划)
- NYOJ-171 第三届河南省ACM竞赛 聪明的KK (简单的DP)
- 聪明的kk 【DP】
- NYOJ171. 聪明的kk(二维DP)
- NYOJ题目171-聪明的kk(dp)
- 聪明的kk(南阳oj171)(dp固定终点的最长路)
- NYOJ-171-聪明的kk(第三届河南省程序设计大赛D题(简单dp))
- NYOJ 171 聪明的kk 【动态规划入门】
- NYOJ 171 聪明的kk (dp问题)
- nyoj 171 聪明的kk【二维dp&&求最大值】
- NYOJ 171 聪明的kk(基础dp)
- DP入门篇
- POJ3624 01背包入门题[DP]
- DP入门篇
- DP入门,最长上升子序列,ZJU 2136
- 2084 数塔 (DP入门题) 自底向上,f[i,j]=f[i,j]+max{f[i+1,j],f[i+1,j+1]}。
- 状态压缩DP入门题
- hdu 1561 树形DP入门题
- 概率DP【入门】