Codeforces Round #517 (Div. 2), problem (D) Minimum path 贪心

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Andy123321aa/article/details/83689197

本题运用贪心算法,需要按照字典序输出路径,路径包含2n-1个字符,只需要按正序求出当前情况下的最优解即可。需要注意的是当最优解相同的时候需要保留剩余更改次数更大的那个路径。

在求解本题的过程中由于构思的偏差出现了Runtime error、Memory limit exceeded等错误。在这里记录一下错误原因。

Runtime error的错误原因主要有数组访问越界(我就是)、发生除零错误、大数组定义在函数内导致程序栈区耗尽、指针访问错误的内存区域。

Memory limit exceeded是之前用vector导致的。vector不适合在程序中多次删除,因为除非用swap函数,否则不会释放内存。(虽然我用来swap好像还是Memory limit exceeded不知道为啥了)

ac代码:

#include <bits/stdc++.h>
#define FOR(I,A,B) for(int I = (A); I < (B); I++)
#define FORE(I,A,B) for(int I = (A); I <= (B); I++)
#define PRII pair<int,int> 
#define LL long long 
#define INF 1000000001
using namespace std;
int n,k;
char l[2005][2005];
char jl[4005];
int rm[2005][2005];
int main()
{
	cin>>n>>k;
	FOR(i,0,n){
		string s;
		cin>>s; 
		FOR(j,0,n) l[i][j]=s[j];
	}
	FOR(i,0,n*2-1) jl[i]='z';
	memset(rm,-1,sizeof(rm));
	rm[0][0]=k;
	FOR(i,0,n*2-1){	
		char mn='z';
		FORE(j,0,i){
			if(j>=n||i-j>=n) continue;
			if(rm[j][i-j]>=0){
				char c=l[j][i-j];
				if(c!='a'&&rm[j][i-j]>0) c='a';
				mn=mn<c?mn:c;	
			}
		}
		jl[i]=mn;
		FORE(j,0,i){
			if(j>=n||i-j>=n) continue;
			if(rm[j][i-j]>=0){
				char c=l[j][i-j];
				if(c!='a'&&rm[j][i-j]>0){
					c='a';
					rm[j][i-j]--;
				} 
				if(c==mn){
					if(j<n-1) rm[j+1][i-j]=rm[j+1][i-j]>rm[j][i-j]?rm[j+1][i-j]:rm[j][i-j];
					if(i-j<n-1) rm[j][i-j+1]=rm[j][i-j+1]>rm[j][i-j]?rm[j][i-j+1]:rm[j][i-j];					
				}	
			}
		}
	}
	FOR(i,0,n*2-1) printf("%c",jl[i]);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Andy123321aa/article/details/83689197