• Codeforces Round #256 (Div. 2) C. Painting Fence (搜索 or DP)


    【题目链接】:click here~~

    【题目大意】:题意:你面前有宽度为1,高度给定的连续木板,每次能够刷一横排或一竖列,问你至少须要刷几次。

    Sample Input

    Input
    5
    2 2 1 2 1
    
    Output
    3
    
    Input
    2
    2 2
    
    Output
    2
    
    Input
    1
    5
    
    Output
    1

    搜索:

    // C
    #ifndef _GLIBCXX_NO_ASSERT
    #include <cassert>
    #endif
    
    #include <cctype>
    #include <cerrno>
    #include <cfloat>
    #include <ciso646>
    #include <climits>
    #include <clocale>
    #include <cmath>
    #include <csetjmp>
    #include <csignal>
    #include <cstdarg>
    #include <cstddef>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <ctime>
    
    #if __cplusplus >= 201103L
    #include <ccomplex>
    #include <cfenv>
    #include <cinttypes>
    #include <cstdalign>
    #include <cstdbool>
    #include <cstdint>
    #include <ctgmath>
    #include <cwchar>
    #include <cwctype>
    #endif
    
    // C++
    #include <algorithm>
    #include <bitset>
    #include <complex>
    #include <deque>
    #include <exception>
    #include <fstream>
    #include <functional>
    #include <iomanip>
    #include <ios>
    #include <iosfwd>
    #include <iostream>
    #include <istream>
    #include <iterator>
    #include <limits>
    #include <list>
    #include <locale>
    #include <map>
    #include <memory>
    #include <new>
    #include <numeric>
    #include <ostream>
    #include <queue>
    #include <set>
    #include <sstream>
    #include <stack>
    #include <stdexcept>
    #include <streambuf>
    #include <string>
    #include <typeinfo>
    #include <utility>
    #include <valarray>
    #include <vector>
    
    #if __cplusplus >= 201103L
    #include <array>
    #include <atomic>
    #include <chrono>
    #include <condition_variable>
    #include <forward_list>
    #include <future>
    #include <initializer_list>
    #include <mutex>
    #include <random>
    #include <ratio>
    #include <regex>
    #include <scoped_allocator>
    #include <system_error>
    #include <thread>
    #include <tuple>
    #include <typeindex>
    #include <type_traits>
    #include <unordered_map>
    #include <unordered_set>
    #endif
    
    using namespace std;
    #define rep(i,j,k) for(int i=j;i<=k;++i)
    #define per(i,j,k) for(int i=(int)j;i>(int)k;--i)
    
    #define lowbit(a) a&-a
    #define Max(a,b) a>b?a:b
    #define Min(a,b) a>b?b:a
    #define mem(a,b) memset(a,b,sizeof(a))
    typedef long long LL;
    typedef unsigned long long LLU;
    typedef double db;
    
    const int N=5*1e3+10;
    LL n,m,t,ans,res,cnt,tmp;
    
    LL num[N];
    char str[N];
    bool vis[N];
    
    int dir4[4][2]= {{1,0},{0,1},{-1,0},{0,-1}};
    int dir8[8][2]= {{1,0},{1,1},{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1}};
    
    LL dfs(LL left,LL right)
    {
        LL heng=0,temp=left;
        LL Min_gun=*min_element(num+left,num+right+1);
        rep(i,left,right){
            num[i]-=Min_gun;
        }
        rep(i,left,right){
            if(num[i]==0){
                heng+=dfs(temp,i-1);
                temp=i+1;
            }
        }
        if(temp<=right) heng+=dfs(temp,right);
        return min(heng+Min_gun,right-left+1);
    }
    int main()
    {
        while(scanf("%lld",&n)!=EOF)
        {
            rep(i,0,n-1){
                scanf("%lld",&num[i]);
            }
            LL result=dfs(0,n-1);
            printf("%lld
    ",result);
        }
        return 0;
    }
    /*首先找到n条木条最短的木条i。
    然后减去它的值。再查找1到i-1,和i+1到n的最小值,因为能够竖着刷,因此比較
    刷完这段区间的横着刷和竖着刷的最小值。

    终于即为答案。 5 2 2 1 2 1 5 1 2 3 2 1 5 3 2 1 2 3 3 3 5 */



  • 相关阅读:
    JS pop push unshift shift的作用与区别
    白话js this指向问题
    JS作用域,作用域,作用链详解
    angular $q promise详解
    白话$resource,$resource中的增删改查
    ng-app与ng-app='myApp'的区别
    详解 高效字节流
    详解 字节输出流 与 字节输入流
    阶段性复习与应用——复制多级文件夹
    详解 字节流
  • 原文地址:https://www.cnblogs.com/llguanli/p/6772602.html
Copyright © 2020-2023  润新知