动态规划—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];
}
感想:复杂的问题可以通过定义多个函数来分解成几个小问题,降低问题的难度。
- 动态规划—26,30滑雪
- 动态规划练习一—26、30滑雪
- ACM-动态规划26-滑雪
- 动态规划练习26:滑雪
- 动态规划练习--26(滑雪)
- 动态规划练习一 26:滑雪
- 动态规划练习题-26(滑雪)
- 动态规划练习——滑雪
- 滑雪动态规划
- 1088--滑雪 动态规划
- 滑雪(动态规划)
- 滑雪(动态规划)
- 滑雪(动态规划)
- POJ1088 滑雪【动态规划】
- 动态规划--滑雪
- 动态规划―滑雪
- Pku_1088_滑雪_动态规划
- 动态规划 :POJ 1088 滑雪
- 二叉树的相关算法
- 简单易学的机器学习算法——Softmax Regression
- jvm内存区域复习
- RFS的web自动化验收测试——第1讲 菜单栏&工具栏
- 大数据开发例子
- 动态规划—26,30滑雪
- Apache 80端口被占用
- TypeScript基本数据类型
- 使用HttpClient实现文件的上传
- org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 23 in XML document from
- HDU 5738 Eureka
- python实现的简易员工管理系统
- 数据库
- 前端入门DAY4-学习笔记