5个WA 看不到评测点 求助

P1434 [SHOI2002] 滑雪

@[ztyx](/user/576690) 代码的错误就出在没有对$dp$数组和高度数组初始化。 ------------ 1. 显而易见,每个$dp_{i,j}$的初始值都应该为$1$,即每个点在开始的位置就都、有为$1$的长度,但具体为什么你的代码没有加这个初始化能过几个点呢?具体原因在下面? 2. 在你的$dp$子中,一个点可能会从边界外的点转移过来,在高度数组未初始化时边界外的点的值为$0$所以可能导致错误或不合法的转移,所以就使你的代码过了样例。 ------------ AC代码如下(球关): ```cpp #include <bits/stdc++.h> using namespace std; struct node { int x,y,h; }; vector<node> v; bool cmp(node x,node y) { return x.h<y.h; } int dp[105][105],H[105][105]; int dx[5]={0,1,-1,0,0}; int dy[5]={0,0,0,1,-1}; int main() { int r,c; cin >> r >> c; memset(H, 0x3f3f3f3f, sizeof H); for (int i = 1; i <= r; i++) for (int j = 1; j <= c; j++) dp[i][j] = 1; for(int i=1;i<=r;i++) for(int j=1;j<=c;j++) { node NEW; NEW.x=i; NEW.y=j; cin >> H[i][j]; NEW.h=H[i][j]; v.push_back(NEW); } sort(v.begin(),v.end(),cmp); for(int j=0;j<v.size();j++) { for(int i=1;i<=4;i++) { if(H[v[j].x][v[j].y]>H[v[j].x+dx[i]][v[j].y+dy[i]]) { dp[v[j].x][v[j].y]=max(dp[v[j].x][v[j].y],dp[v[j].x+dx[i]][v[j].y+dy[i]]+1); } } } int maxn=0; for(int i=1;i<=r;i++) for(int j=1;j<=c;j++) { maxn=max(maxn,dp[i][j]); } cout << maxn; return 0; } ```
by bulopi @ 2024-04-22 19:50:29


@[bulopi](/user/948361) 好的 谢谢啦
by ztyx @ 2024-04-22 21:45:58


|