zoukankan      html  css  js  c++  java
  • CodeForce 448C 木片填涂问题

    题目大意:
    有多片木片需要填涂,可以每次横着涂一行,也可以一次涂一列,当然你涂一行时遇到中间长度不够高的木片,填涂到此中断

    这题目运用dfs能更容易的解出,虽然还是十分不容易理解

     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 #define N 5010
     6 int a[N],n;
     7 
     8 int Min(int c,int d)
     9 {
    10     return c<d?c:d;
    11 }
    12 int dfs(int c,int d,int x) //得到从c号木片到d号木片,x长度下已全部填涂后还需要至少进行几次操作
    13 {
    14     if(c>d) return 0; //c比d大时,就不用填涂了,所以返回0
    15     int t=c,k=a[c];
    16     for(int i=c;i<=d;i++)
    17         if(a[i]<k)
    18             k=a[i],t=i; //找到c到d中木片高度最短的d号
    19     return Min(dfs(c,t-1,a[t])+a[t]- x + dfs(t+1,d,a[t]),d-c+1); //一个是横向求,一个是竖着求,得到他们中的最小值
    20 }
    21 int main()
    22 {
    23     while(cin>>n){
    24         for(int i=0;i<n;i++) cin>>a[i];
    25         cout<<dfs(0,n-1,0)<<endl;
    26     }
    27 
    28     return 0;
    29 }
  • 相关阅读:
    D
    A
    D
    G
    H
    E
    F
    B
    D
    oracle中新建用户和赋予权限
  • 原文地址:https://www.cnblogs.com/CSU3901130321/p/3870178.html
Copyright © 2011-2022 走看看