Codeforces Round #517 (Div. 2), problem (D) Minimum path 贪心
程序员文章站
2022-03-02 23:24:29
...
本题运用贪心算法,需要按照字典序输出路径,路径包含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;
}
推荐阅读
-
Codeforces Round #595 (Div. 3)D1D2 贪心 STL
-
codeforces Educational Codeforces Round 80 (Rated for Div. 2) D - Minimax Problem(状压)
-
Codeforces Round #595 (Div. 3)D1D2 贪心 STL
-
Codeforces Round #FF (Div. 2) D. DZY Loves Modification 贪心+优先队列_html/css_WEB-ITnose
-
Codeforces Round #555 (Div. 3), problem: (C2) Increasing Subsequence (hard version)【贪心+撞到南墙也不回头】
-
Codeforces Round #394 (Div. 2) D. Dasha and Very Difficult Problem 贪心
-
Codeforces Round #412 ( Div. 2) D. Dynamic Problem Scoring(贪心)
-
Codeforces Round #303 (Div. 2) D. Queue —— 贪心
-
Codeforces Round #411 (Div. 2)D. Minimum number of steps(贪心)
-
Codeforces Round #684 (Div. 2) D Graph Subset Problem