日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Codeforces 448C Painting Fence:分治

發布時間:2025/5/22 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Codeforces 448C Painting Fence:分治 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:http://codeforces.com/problemset/problem/448/C

題意:

  有n個木板豎著插成一排柵欄,第i塊木板高度為a[i]。

  你現在要將柵欄上所有地方刷上油漆。

  每次你可以選擇豎著刷或橫著刷,但必須保證一次刷的地方不能間斷。

  問你至少要刷幾次才能刷滿。

?

題解:

  首先有一個貪心結論:

    對于當前要刷的一片區域,令minn為這片區域的最小高度。

    如果選擇橫著刷,則至少要將區域底部的minn層刷完。

    如圖,至少要將下面兩層刷完:

    

  

  然后考慮如何分治:

    對于當前的這一片區域,將最下面的minn層去掉之后,原區域就變成了若干個小區域。

    這樣就轉化成了若干個子問題。

    所以當前區域的最小次數 = min( 只豎著刷的次數, 先橫著刷minn次 + ∑ 子區域的最小次數 )

    即:dfs(x,y) = min(y-x+1, minn + ∑ dfs(Li,Ri))

    邊界條件:x == y時,最多只用豎著刷一次。

?

AC Code:

1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #define MAX_N 5005 5 #define INF 1000000000 6 7 using namespace std; 8 9 int n; 10 int a[MAX_N]; 11 12 int dfs(int x,int y) 13 { 14 if(x==y) return 1; 15 int minn=INF; 16 for(int i=x;i<=y;i++) minn=min(minn,a[i]); 17 for(int i=x;i<=y;i++) a[i]-=minn; 18 int sum=0; 19 int p=x; 20 for(int i=x;i<=y;i++) 21 { 22 if(a[i] && (i==y || !a[i+1])) sum+=dfs(p,i); 23 if(!a[i] && i<y && a[i+1]) p=i+1; 24 } 25 return min(sum+minn,y-x+1); 26 } 27 28 int main() 29 { 30 cin>>n; 31 for(int i=1;i<=n;i++) cin>>a[i]; 32 cout<<dfs(1,n)<<endl; 33 }

?

轉載于:https://www.cnblogs.com/Leohh/p/8252765.html

總結

以上是生活随笔為你收集整理的Codeforces 448C Painting Fence:分治的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。