关于超级TLE的dp过了这件事
查看原帖
关于超级TLE的dp过了这件事
1117080
kevinZ99楼主2023/10/23 12:58

下面是我的代码

#include <bits/stdc++.h>
using namespace std;
int a[105][105];
struct node{
	int x,y,val;
};
node dp[105][105];
int n,m;
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int main(){
//freopen("pjzt2017c.in","r",stdin);
//freopen("pjzt2017c.out","w",stdout);	
	scanf("%d%d",&m,&n);
	for(int i=0;i<n;i++){
		int x,y,c;
		scanf("%d%d%d",&x,&y,&c);
		if(c==0)a[x][y]=1;
		if(c==1)a[x][y]=2;
	}
//	for(int i=1;i<=m;i++){
//		for(int j=1;j<=m;j++)cout<<a[i][j]<<" ";
//		cout<<endl;
//	}
	for(int i=0;i<=m;i++){
		for(int j=0;j<=m;j++)dp[i][j].val=1e9,dp[i][j].x=dp[i][j].y=-1;
	}
	dp[1][1].val=0;
	dp[1][1].x=1;
	dp[1][1].y=1;
	int temp=m*m;
	for(int step=0;step<temp;step++){
		for(int i=1;i<=m;i++){
			for(int j=1;j<=m;j++){
				for(int k=0;k<4;k++){
					int x=i+dx[k];
					int y=j+dy[k];
					if(x<1||y<1||x>m||y>m)continue;
					int ret=dp[x][y].val;
					if(ret>=1e9)continue;
					if(a[x][y]==a[i][j]){
						if(a[x][y]==0)continue;
					}
					else if(a[x][y]!=a[i][j]){
						ret++;
						if(a[i][j]==0)ret++;
					}
					if(a[dp[x][y].x][dp[x][y].y]==a[i][j]&&a[i][j]!=0&&a[x][y]==0)
						ret=dp[x][y].val;
					if(a[dp[x][y].x][dp[x][y].y]!=a[i][j]&&a[i][j]!=0
						&&a[dp[x][y].x][dp[x][y].y]!=0&&a[x][y]==0)ret=dp[x][y].val+1;
					if(ret<dp[i][j].val){
						dp[i][j].val=ret;
						dp[i][j].x=x,dp[i][j].y=y;
					}
				}
			}
		}
		if(dp[m][m].val!=1e9){
			printf("%d\n",dp[m][m].val);
			return 0;
		}
	}
	printf("-1\n");
	return 0;
}
2023/10/23 12:58
加载中...