萌新求助区间dp
  • 板块CF607B Zuma
  • 楼主swl3992
  • 当前回复4
  • 已保存回复4
  • 发布时间2020/8/26 16:12
  • 上次更新2023/11/6 19:16:16
查看原帖
萌新求助区间dp
173918
swl3992楼主2020/8/26 16:12
#include <bits/stdc++.h>
using namespace std;
int dp[550][550];
int num[550];
int n;
void read(int &x)
{
	int num=0,f=1;
	char c;
	c=getchar();
	while(c<'0'||c>'9')
	{
		if(c=='-')
		{
			f=-1;
		}
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		num=(num<<3)+(num<<1)+(c^48);
		c=getchar();
	}
	x=f*num;
}
void print(int x)
{
	if(x<0)
	{
		x=-x;
		putchar('-');
	}
	if(x>=10)
	{
		print(x/10);
	}
	putchar(x%10+'0');
}
  //以上是快读,不用管
int main()
{
	//ios::sync_with_stdio(0);
	read(n);
	for(int i=1;i<=n;i++)
	{
		cin>>num[i];
	}
	for(int i=0;i<=n;i++)
	{
		for(int j=0;j<=n;j++)
		{
			dp[i][j]=10000;	//初始化为较大值,为后面取min
		}
	}
	for(int i=1;i<=n;i++)
	{
		dp[i][i]=1;	//取单个要一次
	}
	for(int i=1;i<n;i++)	//此循环防止后面回文串长度为2时挂掉
	{
		if(num[i]==num[i+1])	//相等可一起取
		{
			dp[i][i+1]=1;
		}
		else
		{
			dp[i][i+1]=2;
		}
	}
	for(int len=3;len<=n;len++)
	{
		for(int i=1;i+len-1<=n;i++)
		{
			int j=i+len-1;
//			cout<<i<<" "<<j;
			if(num[i]==num[j])	
			{
				dp[i][j]=dp[i+1][j-1];
			}
			else
			{
				for(int k=i;k<j;k++)
				{
					dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]);	
				}
			}
//			cout<<" "<<dp[i][j]<<endl;
		}
	}
	print(dp[1][n]);
	return 0;
}

2020/8/26 16:12
加载中...