zoukankan      html  css  js  c++  java
  • POJ1088(DP,DFS)

    1088:滑雪

    时间限制:
    1000ms
    内存限制:
    65536kB
    描述
    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更长。事实上,这是最长的一条。
    输入
    输入的第一行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。
    输出
    输出最长区域的长度。
    样例输入
    5 5 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
    样例输出
    25

    #include"iostream" #include"cstring" using namespace std; int len[100][100]; bool vis[100][100]; int h[100][100]; int dir[4][2]={{0,1},{0,-1},{-1,0},{1,0}}; int row,col; int temp_x,temp_y,temp_len; int dp(int x,int y) {if(vis[x][y])return len[x][y];else{for(int i=0;i<4;i++){temp_x=x+dir[i][0];temp_y=y+dir[i][1];if(temp_x>=0&&temp_x<=row-1&&temp_y>=0&&temp_y<=col-1){if(h[temp_x][temp_y]<h[x][y])//如存在较低点{temp_len=dp(temp_x,temp_y)+1;//可能最大长度if(temp_len>len[x][y])//随时更新,动态规划的精髓所在len[x][y]=temp_len;}}//end if}//end forvis[x][y]=true;//应放在后面,堆栈展开返回后才确定当前点已访问return len[x][y];} } int main() {cin>>row>>col;for(int i=0;i<row;i++)for(int j=0;j<col;j++){cin>>h[i][j];len[i][j]=1;//不要用memset吖,你懂的}memset(vis,false,sizeof(vis));int max=0;int temp_dp;//节省时间开支所用for(int i=0;i<row;i++)for(int j=0;j<col;j++)//这个循环中,前面的vis,len等信息可能会在后面的dp递归中用到,大大节省了时间{temp_dp=dp(i,j);//dp的参数表示的是当前最高点if(max<temp_dp)max=temp_dp;}cout<<max<<endl; }

  • 相关阅读:
    动态规划3--Help Jimmy
    动态规划2--最长公共子序列
    动态规划1--最长公共子序列
    递归5--汉诺塔问题的栈实现
    递归4--汉诺塔问题
    递归3--棋盘分割
    CSS实现和选择器
    Java基础十二--多态是成员的特点
    头文件algorithm中的常用函数
    我是怎样成长为系统架构师的
  • 原文地址:https://www.cnblogs.com/lzhitian/p/2329312.html
Copyright © 2011-2022 走看看