Parsifa1 @ 2022-09-28 15:56:35
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int l[101][101],dp[101][101];
int dx[]={1,0,-1,0},dy[]={0,1,0,-1},k;
struct node {
int num;
int x,y;
}a[10001];
int read() { //偷的快读(
int x=0;
char ch=getchar();
while(ch>'9'||ch<'0') {
ch=getchar();
}
while(ch>='0'&&ch<='9') {
x=x*10+ch-'0';
ch=getchar();
}
return x;
}
bool cmp(node x,node y){
return x.num<
y.num;
}
int main() {
int r,c,ans=0;
r=read();
c=read();
for(int i=0;i<r;i++) { //读入并储存到一维数组中以便排序
for(int j=0;j<c;j++) {
l[i][j]=read();
a[k++].num=l[i][j];
a[k].x=i;a[k].y=j;
}
}
sort(a,a+k,cmp);
for(int i=0;i<k;i++) {
int x0=a[i].x,y0=a[i].y;
for(int j=0;j<4;j++) {
int x1=a[i].x+dx[j],y1=a[i].y+dx[j];
if(x0>=0&&x0<r&&y0>=0&&y0<c) {
if(l[x0][y0]<l[x1][y1]) {
dp[x0][y0]=max(dp[x1][y1]+1,dp[x0][x0]);
}
}
}
ans = max(dp[x0][y0],ans);
}
cout<<ans+1;
}
by A_Big_Jiong @ 2022-09-28 17:59:14
代码
修改的地方有点多,我尽量回忆回忆,下面的行数参照你的代码
k++的位置不对(39行),应当在所有数据存储完毕后再自加,你代码中自加在前面导致x, y和num并没有存在同一个a[i]中
50行: y1 计算错误,这种短的就不建议复制粘贴了qwq
51行: 应当是y1不超出边界,而不是y0。因为y0是你当前的点,不可能超出边界
52行: 你想用(x1, y1)来更新(x0, y0),所以说你应当使得(x1, y1) 低于(x0, y0),这样才满足更新的条件
53行:dp的方程右边写成dp[x0][x0]了qwq
不要在意我自己写了个max,没啥用
P.S. 记得写return 0;
应该是没了吧,再有我也想不起来了
贡?万岁qwq
by A_Big_Jiong @ 2022-09-28 18:00:21
我橙没了
呜呜呜~
by Parsifa1 @ 2022-09-28 18:48:24
@A_Big_Jiong 谢谢佬! 贡橙好捏
by Parsifa1 @ 2022-09-28 19:10:38
@A_Big_Jiong 有个小疑问,不知道说的对不对:
if(l[x0][y0]>l[x1][y1]) {
dp[x0][y0]=max(dp[x1][y1]+1,dp[x0][y0]);}
dp[x0][y0]不是指到达(x0,y0)时的最长路径么 那是不是相当于我现在实现的是个上山的过程,所以才是 x0>x1?QAQ
by Parsifa1 @ 2022-09-28 19:19:14
@A_Big_Jiong 所以说实际上我讲比大小的cmp的符号变向也能ac! 谢谢你的引导@w@