1. 程式人生 > >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,字符串)

bsp mes () print urn getch %d ase etc

#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,字符串)