动态规划—26,30滑雪

来源:互联网 发布:专业调色软件app 编辑:程序博客网 时间:2024/05/17 21:57

题目:输入一个R行C列的方阵,每个坐标输入一个数值代表高度,然后在一个点可以向这个点旁边的上下左右四个点走(旁边的点必须低于这个点),然后求出这个方阵中的可以走的最长长度。

解题思路:先定义两个数组dx[]={-1,0,1,0},dy[]={0,1,0,-1}利用循环通过这两个数组与原来坐标相加判断四周的情况,定义一个ok函数,判断该走的那个点是不是在矩阵范围之内,然后定义一个dp(int i, int j)判断在(i,j)时的最长路线,然后在通过双重循环求出所有的坐标的最长长度,最后通过与max比较求出最大值即所有中的最大值,就是最长长度。

细节处理:利用ok函数判断要走的点是否在范围内。

代码:#include<bits/stdc++.h>
using namespace std;
int r,c;
int dx[]={-1,0,1,0},dy[]={0,1,0,-1};
int h[101][101],len[101][101];
int main()
{   
int i,j,max;
cin>>r>>c;
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
cin>>h[i][j];
memset(len,0,sizeof(len));
int ok(int x,int y);
int dp(int x,int y);
max=-1;
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
{len[i][j]=dp(i,j);
if(max<len[i][j])
max=len[i][j];}
cout<<max+1<<endl;
return 0;


}
bool ok(int i,int j)
{
return (i>=1&&i<=r&&j>=1&&j<=c);
}
int dp(int i,int j)
{
int k;
if(len[i][j]>0)
return len[i][j];
for(k=0;k<4;k++)
{
if(ok(i+dx[k],j+dy[k]))
if(h[i+dx[k]][j+dy[k]]<h[i][j])
{
if(len[i][j]<dp(i+dx[k],j+dy[k])+1)
len[i][j]=dp(i+dx[k],j+dy[k])+1;
}

return len[i][j];
}

感想:复杂的问题可以通过定义多个函数来分解成几个小问题,降低问题的难度。

0 0