模拟——1031D

Posted zsben991126

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模拟——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;
}

 

以上是关于模拟——1031D的主要内容,如果未能解决你的问题,请参考以下文章

模拟赛1031d2

iOS Swift 中的 Android 片段模拟

php 在终端中模拟一点加载字符的片段

当我想模拟数据并测试 UI 片段时,doNothing() 不起作用

google-map 片段应用程序在模拟器中崩溃后打开 WebView 活动

一个函数应该返回什么可以失败?