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 }
相關文章
相關標籤/搜索