codeforces1114D. Flood Fill(区间Dp)

传送门:

解题思路:

区间Dp,发现某一个区间修改后区间颜色一定为左边或右边的颜色。

那么只需要设方程$f_(l,r,0/1)$表示区间$[l,r]$染成左/右颜色的最小代价

转移就是枚举左右颜色就好了,时间复杂度$O(n^2)$

代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define L 0
 5 #define R 1
 6 int n,n_;
 7 int c[5001];
 8 int f[5001][5001][2];
 9 int main()
10 {
11     scanf("%d",&n);
12     for(int i=1;i<=n;i++)
13     {
14         n_++;
15         scanf("%d",&c[n_]);
16         if(c[n_]==c[n_-1])n_--;
17     }
18     n=n_;
19     for(int len=2,l;len<=n;len++)for(l=1;l<=n-len+1;l++)
20     {
21         int r=l+len-1;
22         f[l][r][L]=std::min(f[l+1][r][L]+(c[l]!=c[l+1]),f[l+1][r][R]+(c[r]!=c[l]));
23         f[l][r][R]=std::min(f[l][r-1][L]+(c[l]!=c[r]),f[l][r-1][R]+(c[r]!=c[r-1]));
24     }
25     printf("%d\n",std::min(f[1][n][L],f[1][n][R]));
26     return 0;
27 }

 

posted @ 2019-02-15 23:47  Unstoppable728  阅读(336)  评论(0编辑  收藏  举报