Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2)D(思维,DP,字符串)
Posted ldudxy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2)D(思维,DP,字符串)相关的知识,希望对你有一定的参考价值。
#include<bits/stdc++.h>
using namespace std;
char c[2007][2007];
char ans[4007];
int s[2007][2007];
int main(){
memset(s,-1,sizeof(s));
int n,k;
scanf("%d%d",&n,&k);
getchar();
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%c",&c[i][j]);
}
getchar();
}
s[1][1]=k;//初始可改变的次数
char mn=0;
char tmp=0;
for(int i=1;i<=n*2-1;i++){
mn=‘z‘;
for(int j=1;j<=i;j++){
if(j>n||i-j+1>n)
continue;
if(s[j][i-j+1]>-1){//可达位置
tmp=c[j][i-j+1];
if(tmp!=‘a‘&&s[j][i-j+1]>0)//改变机会未用完
tmp=‘a‘;
mn=min(mn,tmp);
}
}
ans[i]=mn;//i可走到的位置的最小值
for(int j=1;j<=i;j++){
if(j>n||i-j+1>n)
continue;
if(s[j][i-j+1]>-1){
tmp=c[j][i-j+1];
if(tmp!=‘a‘&&s[j][i-j+1]>0){//贪心,前面有机会能变a就变
tmp=‘a‘;
s[j][i-j+1]--;
}
if(tmp==mn){//可行出路之一
if(j<n)
s[j+1][i-j+1]=max(s[j+1][i-j+1],s[j][i-j+1]);//走改变少的路
if(i-j+1<n)
s[j][i-j+2]=max(s[j][i-j+2],s[j][i-j+1]);//走改变少的路
}
}
}
printf("%c",ans[i]);
}
return 0;
}
以上是关于Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2)D(思维,DP,字符串)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2)D(思维,DP,字符串)
Codeforces Round #436 E. Fire(背包dp+输出路径)
[ACM]Codeforces Round #534 (Div. 2)
LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力