刷油漆

题意

cxm 需要给一块长木板刷上油漆。他一次可以将一段的木板刷上同一种颜色,刷过的木板可以再刷成其他颜色。现在木板被分成了若干块,每块需要涂成一个确定的颜色。 cxm 希望你告诉他最少需要涂几次就可以将每块都涂成需要的颜色。

  • 区间DP
  • $turn$函数比较迷
  • 有十分有毒~(学长有毒)~

还是比较简单的区间DP,就是在区间DP基础上加了一个$turn$
虽然我没搞懂$turn$(但我拿了90,滑稽)

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=2010;
int n,t,s[maxn];
int f[maxn][maxn];
int turn(int a,int b,int c)
{
    if(s[a]==s[b]||s[a]==s[c+1]||s[c]==s[b]||s[c]==s[c+1])return -1;
    return 0;
}
int main()
{
    freopen("paint.in","r",stdin);
    freopen("paint.out","w",stdout);
    scanf("%d",&t);
    while(t--)
    {
        memset(f,0x3f,sizeof f);
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
             scanf("%d",&s[i]);
             f[i][i]=1;
        }
        for(int l=1;l<=n;l++)for(int i=1;i+l<=n;i++)
        {
             int j=i+l;for(int k=i;k<j;k++)
             f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+turn(i,j,k));
        }
        printf("%d\n",f[1][n]);
    }
}