1. 程式人生 > >CQOI2007 塗色 paint

CQOI2007 塗色 paint

() mic 直接 microsoft n) soft 想象 思路 sizeof

聽說這道題是當年省選題

於是興致勃勃拿來做了做

至於如何想到思路...

事實上沒想象中那麽簡單...

腦闊挺疼的...

(一開始都沒看出來是區間dp)

想到可以區間dp,然後就似乎沒啥大問題

枚舉區間dp[i][j]的時候,如果i j一樣那就好說,相當於當初某一次塗的時候多往外塗一格就好

如果i j不一樣?我反而在這裏懵了

但我誤打誤撞就給正解寫出來了

想不到正解居然這麽簡單???

認真思考之後大體明白了

因為不能像i==j那樣直接多塗一個

所以就可以直接區間枚舉了...

總有一個是最優的

 1 #include<cstdio>
 2 int
min(int a,int b){return a<b?a:b;} 3 char colin[52]; 4 int col[52],dp[52][52]; 5 int main() 6 { 7 scanf("%s",colin); 8 int n=strlen(colin); 9 for(int i=0;i<n;i++) 10 { 11 col[i+1]=colin[i]; 12 } 13 memset(dp,0x3f,sizeof(dp)); 14 for(int i=0;i<=n+1
;i++)dp[i][i]=1; 15 for(int d=1;d<n;d++) 16 { 17 for(int i=1;i+d<=n;i++) 18 { 19 if(col[i]==col[i+d])dp[i][i+d]=min(dp[i][i+d-1],dp[i+1][i+d]); 20 else for(int k=i;k<i+d;k++) 21 { 22 dp[i][i+d]=min(dp[i][i+d],dp[i][k]+dp[k+1
][i+d]); 23 } 24 } 25 } 26 printf("%d",dp[1][n]); 27 return 0; 28 }

以上,有點後悔出生太晚了

2018NOIP簡直毒瘤啊

再看看當年省選...

(NOIP=POI*N)

CQOI2007 塗色 paint