考虑DP,朴素的DP是N^2
发现如果有路径A->B,B->C,A->C,那么一定是A->B,然后再B->C
也就是说,对某个点有影响的点位于一个凸包上。由于坐标范围只有[1,M],所以复杂度应该是O(NM),实际上可以通过此题。
似乎转移的斜率还有单调性,但是懒得再推了。
#include<bits/stdc++.h>
#define M 1010
#define N 200100
using namespace std;
int va[M][M];
int dp[M][M];
int zx[M];
int n,m;
int main(){
scanf("%d%d",&n,&m);
for(int i=0,a,b,c;i<n;i++){
scanf("%d%d%d",&a,&b,&c);
va[a][b]=c;
}
for(int i=1;i<=m;i++){
for(int j=1;j<=m;j++){
if(!va[i][j]) continue;
dp[i][j]=-1008610086;
for(int k=1;k<=j;k++){
if(!zx[k]) continue;
dp[i][j]=max(dp[i][j],dp[zx[k]][k]-(j-k)*(j-k)-(i-zx[k])*(i-zx[k]));
}
if(i==1&&j==1) dp[i][j]=0;
dp[i][j]+=va[i][j];
zx[j]=i;
}
}
printf("%d\n",dp[m][m]);
return 0;
}
?