列表

详情


NC14318. Task

描述

𝐴𝑟𝑖𝑎接到了一份来自校方的委托,虽然没有学分但也必须完成。
需要粉刷𝑛条木板,这些木板按照左端对齐,每条木板的高度都是1,
第𝑖条木板的长度为𝐴𝑖
𝐴𝑟𝑖𝑎只有一个宽度为1的刷子,她每次可以水平或者竖直地对连续的
位置进行粉刷,刷子不能经过没有木板的位置。
𝐴𝑟𝑖𝑎对校方的这个安排非常不满,但为了效率,她允许重复粉刷一个
位置,希望通过最少的次数来完成这𝑛条木板的粉刷。

输入描述

第一行,一个正整数𝑛。
第二行,𝑛个正整数𝐴𝑖

输出描述

一行,一个整数,需要进行的最小粉刷次数。

示例1

输入:

5
2 2 1 2 1

输出:

3

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 5ms, 内存消耗: 508K, 提交时间: 2020-01-15 16:28:13

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e3+10;
int n,a[N];
inline int solve(int l,int r){
	int mi=1e14,pre=l,res;
	for(int i=l;i<=r;i++)	mi=min(mi,a[i]);	res=mi;
	for(int i=l;i<=r;i++){
		a[i]-=mi;
		if(!a[i])	res+=solve(pre,i-1),pre=i+1;
	}
	if(pre!=r+1)	res+=solve(pre,r);
	return min(res,r-l+1);
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++)	cin>>a[i];
	cout<<solve(1,n);
	return 0;
}

C++(g++ 7.5.0) 解法, 执行用时: 4ms, 内存消耗: 412K, 提交时间: 2023-07-03 16:38:16

#include<iostream>
using namespace std;
const int N=3e3+10;
int n;
int a[N];
int dfs(int l,int r)
{
    int ans=0,minn=2e9,pre=l;
    for(int i=l;i<=r;i++) minn=min(minn,a[i]);
    ans+=minn;
    for(int i=l;i<=r;i++){
        a[i]-=minn;
        if(a[i]==0){
            ans+=dfs(pre,i-1);
            pre=i+1;
        }
    }
    if(pre!=r+1) ans+=dfs(pre,r);
    return min(ans,r-l+1);
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    cout<<dfs(1,n);
}

C++(clang++ 11.0.1) 解法, 执行用时: 3ms, 内存消耗: 444K, 提交时间: 2022-10-06 21:50:26

#include<bits/stdc++.h>
using namespace std;
const int N=3010;
int a[N],n;
int dfs(int l,int r)
{
    int mi=1e9;
    for(int i=l;i<=r;i++)mi=min(mi,a[i]);
    int res=mi,pre=l;
    for(int i=l;i<=r;i++)
    {
        a[i]-=mi;
        if(!a[i])res+=dfs(pre,i-1),pre=i+1;
    }
    if(pre!=r+1)res+=dfs(pre,r);
    return min(res,r-l+1);
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    cout<<dfs(1,n);
}

上一题