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

#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;
}