模拟——1031D

/*
dp[i][j]表示到[i,j]的权值
cnt[i,j]表示到[i,j]还可以使用的修改的次数 
cnt[i,j]=max(cnt[i-1,j],cnt[i,j-1])
如果mp[i,j]!='a',cnt[i,j]--,没得减就赋值dp[i,j],最后找到最小的dp[i,j]输出 
*/
#include<bits/stdc++.h>
using namespace std;
#define maxn 2005
#define INF 0x3f3f3f3f
 
int n,k,dp[maxn][maxn],cnt[maxn][maxn];
char mp[maxn][maxn];
int main(){
    cin>>n>>k;
    for(int i=1;i<=n;i++)
        scanf("%s",mp[i]+1);
    for(int i=0;i<=n;i++)
        dp[0][i]=dp[i][0]=INF;
    cnt[1][0]=cnt[0][1]=k;dp[0][1]=dp[1][0]=0;
    for(int k=1;k<=2*n-1;k++){
        int Min=INF;
        for(int i=1;i<=n;i++){
            int j=k-i+1;
            if(j<=0 || j>n)continue;
            cnt[i][j]=max(cnt[i-1][j],cnt[i][j-1]);
            if(cnt[i][j]){//还可以修改 
                if(mp[i][j]!='a')cnt[i][j]--;
                dp[i][j]=0;
            }            
            else {
                dp[i][j]=min(dp[i-1][j],dp[i][j-1]); 
                if(dp[i][j]!=INF)dp[i][j]=mp[i][j]-'a';
            }
            Min=min(Min,dp[i][j]);
        }
        
        cout<<(char)(Min+'a');
        
        for(int i=1;i<=n;i++){
            int j=k-i+1;
            if(j<=0 || j>n)continue;
            if(dp[i][j]!=Min)dp[i][j]=INF;
        }
    }
    puts("");
    /*for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++)
            cout<<dp[i][j]<<" ";
        puts("");
    }*/
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/zsben991126/p/10807176.html