区间DP滞销,帮帮孩子吧
查看原帖
区间DP滞销,帮帮孩子吧
593791
_Catluo_楼主2023/10/19 20:32

60pts

记 fl,r,0/1f_{l,r,0/1} 表示在 [l,r][l,r] 区间内是否有 MM ,默认开头有一个 MM ,但是算出来会比答案大,不知道为什么


#include<bits/stdc++.h>
using namespace std;
int n;
int s[55];
int f[55][55][2];
void Init(){
	char ch=getchar();
	while('a'<=ch&&ch<='z'){
		s[++n]=ch-'a';
		ch=getchar();
	}
	return;
}
bool check(int L_1,int R_1,int L_2,int R_2){
	for(int i=0;i<R_1-L_1;i++)
		if(s[L_1+i]!=s[L_2+i])return 0;
	return 1;
}
signed main(){
	Init();
	memset(f,0x3f,sizeof f);
	for(int i=0;i<n;i++){
		for(int l=1;l+i<=n;l++){
			int r=l+i;
			f[l][r][0]=r-l+1;
			f[l][r][1]=r-l+2;
			if((i&1)&&check(l,(l+r)/2,(l+r+1)/2,r))
				f[l][r][0]=min(f[l][(l+r)/2][0]+1,f[l][r][0]);//直接加R 
			for(int k=l;k<r;k++)
				f[l][r][0]=min(f[l][r][0],f[l][k][0]+r-k);//考虑末尾的几个为直接加进去的 
			for(int k=l;k<r;k++)
				f[l][r][1]=min(f[l][r][1],min(f[l][k][0],f[l][k][1])+min(f[k+1][r][0],f[k+1][r][1])+1);//放M 
		}
	}
	cout<<min(f[1][n][0],f[1][n][1]);
	return 0;
}

2023/10/19 20:32
加载中...