codeforces1114D. Flood Fill(区间Dp)

传送门:spa

解题思路:

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

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

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

代码:string

 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 }
相关文章
相关标签/搜索