hbhz_zcy @ 2021-08-02 20:52:57
没看题解,思路如下:
易知从大到小和从小到大是一个东西,因此
维护原数组a,顺序数组s,求解数组l
各个点从小到大排一遍序
从小到大去搜索每一个点,看能否向旁边更大的点扩充并使它的道路长度更大
请问是我的思路错了还是代码的某些细节出现了问题(样例已过得分60pts)
code
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=110,tx[4]={0,0,-1,1},ty[4]={-1,1,0,0};
int a[maxn][maxn],l[maxn][maxn];
struct node{int v,x,y;}s[maxn*maxn];
bool cmp(node x,node y){return x.v<y.v;}
int main(){
memset(l,0,sizeof(l));memset(s,0,sizeof(s));
int m,n;scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
scanf("%d",&a[i][j]);l[i][j]++;
s[i*n+j-n].v=a[i][j],s[i*n+j-n].x=i,s[i*n+j-n].y=j;
}
}
sort(s+1,s+m*n+1,cmp);
for(int i=1;i<=n*m;i++){
int v=s[i].v,x=s[i].x,y=s[i].y;
for(int i=0;i<=3;i++){
int vx=x+tx[i],vy=y+ty[i];
if(vx<1||vx>m||vy<1||vy>n) continue;
if(a[vx][vy]>v) l[vx][vy]=max(l[vx][vy],l[x][y]+1);
}
// for(int i=1;i<=m;i++){
// for(int j=1;j<=n;j++){
// printf("%d ",l[i][j]);
// }
// printf("\n");
// }
// printf("\n");
}
// for(int i=1;i<=m*n;i++)
// printf("%d:%d %d %d\n",i,s[i].x,s[i].y,s[i].v);
printf("%d\n",l[s[m*n].x][s[m*n].y]);
return 0;
}
by 159号程序员 @ 2021-08-02 21:04:04
@38432386zcy 思路错了吧,这道题不能用暴力,应该用记忆化搜索/dp
by hbhz_zcy @ 2021-08-02 21:14:46
@159号程序员 然而我分析了一遍并没有发现思路导致的错误
by 159号程序员 @ 2021-08-02 21:26:14
@38432386zcy 复杂度高了啊
by hbhz_zcy @ 2021-08-02 21:41:16
@159号程序员
%%%
by AChun @ 2021-08-09 17:04:53
敢问dalao现在解决了吗?蒟蒻也是这个思路错了#6#8#9#10
by long_int @ 2021-09-09 13:33:23
@159号程序员 蒟蒻求问,复杂度为什么会高?这不是
by long_int @ 2021-09-09 13:34:07
打错了
by 159号程序员 @ 2021-09-09 18:32:14
@Cuber_xh 没错,是
by long_int @ 2021-09-10 12:45:41
@159号程序员
by long_int @ 2021-09-10 12:46:19
可AC(看下面的回复)