【♂Not The Triumph♂O(∩_∩)O哈哈~But The Struggle♂】

竞赛决不是捷径,它只是另一种艰辛的生活方式。得到与失去,只有时间会去评判;成功与失败,只有历史能去仲裁。我不会永远成功,正如我不会永远失败一样

  C++博客 :: 首页 :: 联系 ::  :: 管理
  6 Posts :: 239 Stories :: 25 Comments :: 0 Trackbacks

常用链接

留言簿(7)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 108444
  • 排名 - 229

最新评论

阅读排行榜

评论排行榜

Michael喜欢滑雪这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-...-3-2-1更长。事实上,这是最长的一条。

input:
输入的第一行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000

output:
输出最长区域的长度。

input:
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

output:
25

【参考程序】:
#include<stdio.h>
#include
<stdlib.h>
#include
<string.h>
int r,c,i,j,k,ans;
int a[110][110],f[110][110];
int max(int a,int b)
{
    
if (a>b) return a;
    
else return b;
}
int dp(int i,int j)
{
    
int up,down,left,right;
    
if (!(f[i][j]==0xfffffff))
    {
        
return f[i][j];
    }
    up
=1;left=1;down=1;right=1;
    
if ((i>1)&&(a[i-1][j]>a[i][j])) left=left+dp(i-1,j);
    
if ((i<r)&&(a[i+1][j]>a[i][j])) right=right+dp(i+1,j);
    
if ((j>1)&&(a[i][j-1]>a[i][j])) down=down+dp(i,j-1);
    
if ((j<c)&&(a[i][j+1]>a[i][j])) up=up+dp(i,j+1);
    f[i][j]
=max(max(left,right),max(up,down));
    
return f[i][j];
}
int main()
{
    scanf(
"%d%d",&r,&c);
    
for (i=1;i<=r;i++)
      
for (j=1;j<=c;j++)
      {
            scanf(
"%d",&a[i][j]);
            f[i][j]
=0xfffffff;
      }
    ans
=0;
    
for (i=1;i<=r;i++)
      
for (j=1;j<=c;j++)
      {
            k
=dp(i,j);
            
if (ans<k) ans=k;
        }
    printf(
"%d\n",ans);
    system(
"pause");
    
return 0;
}
posted on 2009-03-29 08:44 开拓者 阅读(162) 评论(0)  编辑 收藏 引用 所属分类: 动态规划&背包

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理