zoukankan      html  css  js  c++  java
  • 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;
    }

    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    LIS
    原根
    数三角形
    组合数问题
    最短路问题
    2020总结
    树状数组
    康托展开
    LCA
    并查集
  • 原文地址:https://www.cnblogs.com/ldudxy/p/10030014.html
Copyright © 2011-2022 走看看