1 条题解

  • 0
    @ 2026-7-5 14:01:37

    首先砍树的全部代价其实就是每个数的代价加上每个相邻的两个树代价的其中一个。

    那么最小代价就是$\sum_{i=1}^{n} a[i]+\sum_{i=1}^{n-1}min(a[i],a[i+1])$。

    而达到这个最小代价的条件就是:对于任意 iia[i]a[i]a[i+1]a[i+1] 中代价最大的应该先被砍掉,如果两个相同就随意。

    好熟悉啊,但我不会,看了题解区,我就说怎么这么熟悉

    好了现在最大的问题是两个相等咋办,那就是小于和大于合并起来就行了。

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    const int N=4010,P=1e9+7;
    int dp[N][N],a[N],s[N][N],v[N];
    signed main()
    {
    	int n;cin>>n;
    	for(int i=1;i<=n;i++)cin>>a[i];
    	dp[1][1]=s[1][1]=1;
    	for(int i=2;i<=n;i++)
    	{
    		for(int j=1;j<=i;j++)
    		{
    			if(a[i]>a[i-1])
    				dp[i][j]=s[i-1][j-1];
    			else if(a[i]==a[i-1])
    				dp[i][j]=s[i-1][i-1];
    			else 
    				dp[i][j]=((s[i-1][i-1]-s[i-1][j-1])%P+P)%P; 
    		}
    		for(int j=1;j<=i;j++)s[i][j]=(s[i][j-1]+dp[i][j])%P;
    	}
    	cout<<s[n][n];
    	return 0;
    }
    • 1

    信息

    ID
    12155
    时间
    2000ms
    内存
    1024MiB
    难度
    10
    标签
    递交数
    4
    已通过
    2
    上传者