首页 > 其他 > 详细

P1136 迎接仪式

时间:2021-06-19 00:01:26      阅读:23      评论:0      收藏:0      [点我收藏+]

by luogu    

 

技术分享图片

范围

技术分享图片

一个dp题

#include<bits/stdc++.h>

using namespace std;

int n,m;
char a[555];
int ans=-1111;
int dp[555][111][111][3];
char flag[555];
//@xjz 

int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>m;
    cin>>a+1;
    
    memset(dp,-10101,sizeof(dp));
    //赋初值 
//    mcopy();
    dp[0][0][0][1]=0;
    //开头的还没有改变 
    //i位改变j个j和k个z,当前为z(1)j(0).... 
    for(int i=1;i<=n;i++)
    {//一共n个 
        for(int j=0;j<=m;j++)
        {//最多m次 
            for(int k=0;k<=m;k++)
            {
                //我们考虑当前字串,然后考虑它的状态 
                dp[i][j][k][a[i]==z]=max(dp[i-1][j][k][0]+(a[i]==z),dp[i-1][j][k][1]);
                //他是上个的j状态, 
                if(a[i]==z)//这一位是‘z‘  
                {
                if(k)//如果改变过‘z‘ ,尝试和之前状态更新 
                dp[i][j][k][0]=max(dp[i-1][j][k-1][0],dp[i-1][j][k-1][1]);
                }
                
                else if(j)//如果改变过‘j‘ ,尝试和之前状态更新
                dp[i][j][k][1]=max(dp[i-1][j-1][k][0]+1,dp[i-1][j-1][k][1]);
                //            
            }
            
        }
        
    }
    for(int i=0;i<=m;i++)
    ans=max(ans,max(dp[n][i][i][0],dp[n][i][i][1]));
    //我们最后要看改变了m个以内中的最大值 
    
    
    cout<<ans;
    
    return 0;
}

 

P1136 迎接仪式

原文:https://www.cnblogs.com/Hehe-0/p/14900952.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!