Codeforces 448C. Painting Fence
http://codeforces.com/contest/448/problem/C
Bizon the Champion isn't just attentive, he also is very hardworking.
Bizon the Champion decided to paint his old fence his favorite color, orange. The fence is represented as nvertical planks, put in a row. Adjacent planks have no gap between them. The planks are numbered from the left to the right starting from one, the i-th plank has the width of 1 meter and the height of ai meters.
Bizon the Champion bought a brush in the shop, the brush's width is 1 meter. He can make vertical and horizontal strokes with the brush. During a stroke the brush's full surface must touch the fence at all the time (see the samples for the better understanding). What minimum number of strokes should Bizon the Champion do to fully paint the fence? Note that you are allowed to paint the same area of the fence multiple times.
The first line contains integer n (1 ≤ n ≤ 5000) — the number of fence planks. The second line contains n space-separated integers a1, a2, ..., an (1 ≤ ai ≤ 109).
Print a single integer — the minimum number of strokes needed to paint the whole fence.
5 2 2 1 2 1
3
2 2 2
2
1 5
1
In the first sample you need to paint the fence in three strokes with the brush: the first stroke goes on height 1 horizontally along all the planks. The second stroke goes on height 2 horizontally and paints the first and second planks and the third stroke (it can be horizontal and vertical) finishes painting the fourth plank.
In the second sample you can paint the fence with two strokes, either two horizontal or two vertical strokes.
In the third sample there is only one plank that can be painted using a single vertical stroke.
答題思路:遞迴分治。在區間(l,r)上,找出a[i]的值最小的點,然後取return min(r-l+1,dfs(l,m-1,a[m])+dfs(m+1,r,a[m])+a[m]-k);前者為全都豎著刷,後者是橫著刷然後遞迴。詳見程式碼:
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int a[10005],n;
int dfs(int l,int r,int k)
{
if(r<l)
return 0;
if(r==l)
{
if(a[r]<=k)
return 0;
else
return 1;
}
int m=min_element(a+l,a+r+1)-a;
return min(r-l+1,dfs(l,m-1,a[m])+dfs(m+1,r,a[m])+a[m]-k);
}
int main()
{
while(~scanf("%d",&n))
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
printf("%d\n",dfs(1,n,0));
}
return 0;
}
相關文章
- Codeforces 448C Painting Fence:分治AI
- CF448C Painting Fence(遞迴+貪心)AI遞迴
- A - Fence CodeForces - 1422A
- CodeForces - 282B Painting EggsAI
- codeforces 651B Beautiful Paintings (想法)AI
- Fence RepairAI
- ACM Color the fenceACM
- BZOJ3742 : PaintingAI
- win10 fence如何刪除_win10 fence刪除詳細步驟Win10
- 1469C Building a FenceUI
- fence_ipmilan 的一個缺陷MILA
- The Five Colors of Chinese Painting(陳潔)AI
- Outpainting with Stable Diffusion on an infinite canvasAICanvas
- POJ 3253 Fence Repair 優先佇列AI佇列
- HDU 3685 Rotational Painting(凸包+重心)AI
- HDU5709 : Claris Loves PaintingAI
- POJ 1691 Painting A Board(dfs搜尋)AI
- 深入淺出 Flutter Framework 之 PaintingContextFlutterFrameworkAIGCContext
- HDU 4667 Building Fence(求凸包的周長)UI
- POJ 3253Fence Repair(哈夫曼&優先佇列)AI佇列
- agc023C – Painting Machines(組合數)GCAIMac
- Codeforces
- Android 12(S) 影像顯示系統 - GraphicBuffer同步機制 - FenceAndroid
- codeforces Mafia
- codeforces Winner
- codeforces Educational Codeforces Round 33 (Rated for Div. 2)
- 【CodeForces訓練記錄】Codeforces Global Round 27
- POJ 3253-Fence Repair(哈夫曼樹-最小值優先佇列)AI佇列
- 「暑期訓練」「Brute Force」 Restoring Painting (CFR353D2B)RESTAI3D
- P10298 [CCC 2024 S4] Painting RoadsAI
- codeforces Educational Codeforces Round 33 (Rated for Div. 2)B
- codeforces Photo of The Sky
- Codeforces - Jzzhu and Numbers
- codeforces #442 B
- Codeforces Sereja and Array
- Codeforces Round #174
- Codeforces Round #170
- Codeforces Round 955