Sicily 1563. GECKO

【题意】

在一个网格上,每个格子里面有不同数量的蚊子。有一只灰常卡哇伊的壁虎,她从顶行走下来,一直走到最后一行,每经过一个格子她就把那个格子里的蚊子吃掉。问能够吃掉的最大蚊子数目是多少。

【思路】

经鉴定为水题一条,不过体现了动态规划的思想。

状态转移:到达每一个格子能够吃掉的最大蚊子数目等于左上,上,右上三个方向格子里能够吃掉的蚊子数目最大值加上该格子的蚊子数。

状态转移方程:f[i][j]=MAX(f[i-1][j],f[i-1][j-1],f[i-1][j+1])+m[i][j]

 1 #include<cstdio>
 2 #include<memory.h> 
 3 #include<iostream> 
 4 using namespace std;
 5 
 6 int MAX(int x,int y,int z)
 7 {
 8     if(x>=y)
 9     {
10             if(x>=z)
11             return x;
12             else
13             return z; 
14     } 
15     else
16     {
17             if(y>=z)
18             return y;
19             else
20             return z; 
21     } 
22 } 
23 int main()
24 {
25     int h,w;
26     scanf("%d%d",&h,&w);
27     
28     int m[h][w+3];
29     memset(m,0,sizeof(m)); 
30     
31     for(int i=0;i<h;i++)
32      for(int j=1;j<=w;j++)
33       scanf("%d",&m[i][j]);
34           
35     int f[h][w+3];
36     memset(f,0,sizeof(f)); 
37     
38     for(int l=1;l<=w;l++)
39       f[0][l]=m[0][l];
40        
41     for(int i=1;i<h;i++)
42      for(int j=1;j<=w;j++)
43       f[i][j]=MAX(f[i-1][j],f[i-1][j-1],f[i-1][j+1])+m[i][j];
44     
45     int ans=0;
46     for(int k=1;k<=w;k++)
47      if(f[h-1][k]>ans)
48       ans=f[h-1][k];
49     
50     printf("%d\n",ans);
51 }                                 

 

posted @ 2012-07-17 18:22  mrlaker  阅读(287)  评论(0编辑  收藏  举报