#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> fence;
int n;
int dfs(vector<int> Now)
{
int len = Now.size(); //计算当前Now的大小(栅栏数量)
int Min = Now[0];
for(int i = 0; i < len; i ++) //找当前最短的长度
if(Now[i] < Min)
Min = Now[i];
if(Min > len) //如果最短的长度比栅栏数量大 则竖着刷
return len;
for(int i = 0; i < len; i ++) //每个栅栏长度变短多少 相当于 栅栏已被横着刷了多少
Now[i] -= Min;
int ans = Min;
vector<int> Next;
for(int i = 0; i < len; i ++)
{
if(Now[i])
Next.push_back(Now[i]);
else
{
if(Next.size()) //防止0连续出现继续dfs
{
ans += dfs(Next); //计算下小组
Next.clear(); //当前组清零
}
}
}
if(Next.size())
ans += dfs(Next); //最后一组栅栏
ans = min(len, ans); //每次都要与栅栏数量(竖着刷次数)做对比 求最优
return ans;
}
int main()
{
while(~scanf("%d", & n))
{
int temp;
for(int i = 0; i < n; i ++)
{
scanf("%d", & temp);
fence.push_back(temp);
}
int ans = dfs(fence);
printf("%d\n", ans);
}
return 0;
}
题意:刷栅栏。输入n表示栅栏数目。之后输入n个整数代表栅栏高度()。每个栅栏宽一个单位。刷子的宽度是一个单位,可以竖着刷(一列刷完) 可以横着刷(一行1单位刷完)。问最少几下刷完。
题解:好久好久好久...最终是仿着别人的dfs完成了。试着改void不会。一开始写的那个程序也是能过16组数据的...不过似乎没有每次刷的时候都判断是否最优而错了。没找不到反例..这道题也算不是很理解。