• 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 }
  • 相关阅读:
    FFT/NTT求高精度多项式乘法
    1e10内的素数和
    KMP变形
    中国剩余定理
    pytorch深度学习:卷积神经网络
    无题
    pytorch深度学习:一般分类器
    pytorch深度学习:非线性模型
    条件性 正则表达式的运用
    js:当前函数获取调用它的函数
  • 原文地址:https://www.cnblogs.com/CSU3901130321/p/3870178.html
Copyright © 2020-2023  润新知