【算法设计题目】——贪心,搜索
怒漆
原题: Codeforces Round #256 (Div. 2) C. Painting Fence(分治贪心)
参考链接:
http://blog.csdn.net/u012860063/article/details/37967187
http://blog.csdn.net/modiz/article/details/37938313
http://blog.csdn.net/u011466175/article/details/38080005
http://www.bubuko.com/infodetail-970683.html
http://blog.csdn.net/kalilili/article/details/46696417
#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
#define N 5005
#define INF 0x3fffffff
int a[N];
int solve(int left, int right)
{
if(left>right)
{
return 0;
}
int answer = 0, min = INF;
for(int j =left;j<=right;j++)
{
if(a[j]<min)
{
min = a[j];
}
}
answer += min;
for(int i=left;i<=right;i++)
{
a[i] -= min;
}
int begin = left;
for(int k=left;k<=right;k++) //会漏掉右边没有出现0的情况
{
if(a[k] == 0)
{
answer += solve(begin, k - 1);
begin = k+1;
}
}
if(begin <= right) //弥补上一种情况
{
answer += solve(begin,right);
}
answer = answer < (right - left + 1) ? answer : (right - left + 1);
return answer;
}
int main()
{
int n;
cin >> n;
for(int i=0;i<n;i++)
{
cin >> a[i];
}
cout << solve(0, n - 1) << endl;
cin >> n;
return 0;
}
//参考链接:
//http://blog.csdn.net/modiz/article/details/37938313
//http://blog.csdn.net/u012860063/article/details/37967187
//http://blog.csdn.net/u011466175/article/details/38080005
浙公网安备 33010602011771号