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 }