CQOI2007 塗色 paint
阿新 • • 發佈:2018-11-19
() mic 直接 microsoft n) soft 想象 思路 sizeof
聽說這道題是當年省選題
於是興致勃勃拿來做了做
至於如何想到思路...
事實上沒想象中那麽簡單...
腦闊挺疼的...
(一開始都沒看出來是區間dp)
想到可以區間dp,然後就似乎沒啥大問題
枚舉區間dp[i][j]的時候,如果i j一樣那就好說,相當於當初某一次塗的時候多往外塗一格就好
如果i j不一樣?我反而在這裏懵了
但我誤打誤撞就給正解寫出來了
想不到正解居然這麽簡單???
認真思考之後大體明白了
因為不能像i==j那樣直接多塗一個
所以就可以直接區間枚舉了...
總有一個是最優的
1 #include<cstdio> 2 intmin(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