wordpress没有找到站点,关键词搜索名词解释,青岛鲁icp 网站制作 牛商网,网站开发制作计算器滑雪滑雪滑雪
ssl 1202
luogu 1434
pku 1088
题目大意#xff1a;
有一个N*M的矩阵#xff0c;每个位置都有一个数#xff0c;可以从大的数走向小的数#xff0c;问可走的路最长是多少 原题
Michael喜欢滑雪百这并不奇怪#xff0c; 因为滑雪的确很刺激。可是为了获…滑雪滑雪滑雪
ssl 1202
luogu 1434
pku 1088
题目大意
有一个N*M的矩阵每个位置都有一个数可以从大的数走向小的数问可走的路最长是多少 原题
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个整数代表高度h0h10000。
Output
输出最长区域的长度。
Sample Input
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
Sample Output
25 方法一
用递归的方法从每一个位置开始都试一遍就可以TLE了一定要用记忆化搜索保存每一位的最优值速度会快很多就AC了
#includecstdio
#includeiostream
#includecstring
#includealgorithm
using namespace std;
int n,m,a[505][505],f[505][505],sum;
const int dx[4]{1,0,-1,0};
const int dy[4]{0,1,0,-1};
int js(int x,int y)
{if (f[x][y]) return f[x][y];//记忆化f[x][y]1;//自身for (int k0;k4;k)if ((xdx[k]0)(xdx[k]n)(ydy[k]0)(ydy[k]m)(a[x][y]a[xdx[k]][ydy[k]]))//判断有没有出界和是否能走f[x][y]max(f[x][y],js(xdx[k],ydy[k])1);//走的话就是它加一不走就是原数求maxreturn f[x][y];
}
int main()
{scanf(%d%d,n,m);for (int i1;in;i)for (int j1;jm;j)scanf(%d,a[i][j]);//输入for (int i1;in;i)//尝试从每一个位置开始for (int j1;jm;j)summax(sum,js(i,j));//求最大的printf(%d,sum);//输出return 0;
}方法二
用线性DP的方法先把每一位用一个数组a存起来在按高度从小到大排序从小到大每一次都判断是否能往四周走能就是下一步1求max用f[i][j]记从i,j开始的最长长度
#includecstdio
#includealgorithm
#includeiostream
using namespace std;
const int dx[4]{1,0,-1,0};
const int dy[4]{0,1,0,-1};
int n,m,t,ans,f[505][505],b[505][505],x1,x2,y1,y2;
struct rec
{int x,y,h;
}a[250005];//结构体
bool cmp(rec ai,rec bi)//排序
{return ai.hbi.h;//按高度从小到大排序
}
int main()
{scanf(%d%d,n,m);for (int i1;in;i)for (int j1;jm;j){t;scanf(%d,b[i][j]);a[t].xi;//存行a[t].yj;//存列a[t].hb[i][j];//存高度f[i][j]1;//自己的长度}sort(a1,a1t,cmp);//排序for (int i1;it;i)//从小到大排序无后效性{x1a[i].x;//行y1a[i].y;//列for (int k0;k4;k){x2x1dx[k];//进一步的行y2y1dy[k];//进一步的列if ((x20)(x2n)(y20)(y2m)(b[x1][y1]b[x2][y2]))//判断有没有出界和是否能走f[x1][y1]max(f[x1][y1],f[x2][y2]1);//求最大的}ansmax(f[x1][y1],ans);//结果最大的}printf(%d,ans);return 0;
}