60分线性DP求助!
查看原帖
60分线性DP求助!
407223
TulipeNoire楼主2021/7/17 15:11
#include<cstdio>//考试时对题面进行了亿些魔改导致代码有些奇怪,会用qwq标记
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<stack>
#include<queue>
#include<vector>
#include<map>
#include<set>
using namespace std;
int n,ans,dp[505][505],M[505][505];//qwq//dp[i][j]表示截至第i个字符,最右边一个M在j后面的最小长度
char A[505],a[505];//qwq
string k[505][505];//qwq
int main () {
    while (cin>>A) {//qwq
        n=strlen(A);
        for (int i=1;i<=n;i++) {
            a[i]=A[i-1];
        }
        for (int i=1;i<=n;i++) {
            string t="";
            for (int j=i;j<=n;j++) {
                t+=a[j];
                k[i][j-i+1]=t;
            }
        }
        memset(dp,127,sizeof(dp));
        memset(M,127,sizeof(M));//M[i][j]表示dp[i][0]到dp[i][j]的最小值
        dp[0][0]=0;
        for (int i=1;i<=n;i++) {
            dp[i][0]=dp[i-1][0]+1;
            for (int j=1;j<i-1;j++) {
                dp[i][j]=min(dp[i-1][j]+1,M[i-1][j]+2);
            }
            if (i!=1) dp[i][i-1]=M[i-1][i-2]+2;
            else dp[i][i-1]=1;
            for (int s=2;s<=i;s+=2) {
                if (k[i-s+1][s/2]==k[i-s+1+s/2][s/2]) dp[i][i-s]=min(dp[i][i-s],dp[i-s+s/2][i-s]+1);//判断插入R的情况
            }
            M[i][0]=dp[i][0];
            for (int j=1;j<i;j++) {
                M[i][j]=min(M[i][j-1],dp[i][j]);
            }
        }
        ans=1e9;
        for (int i=0;i<n;i++) {
            ans=min(ans,dp[n][i]);
        }
        printf("%d\n",ans);
    }
    return 0;
}
2021/7/17 15:11
加载中...