1 条题解
-
0
首先砍树的全部代价其实就是每个数的代价加上每个相邻的两个树代价的其中一个。
那么最小代价就是$\sum_{i=1}^{n} a[i]+\sum_{i=1}^{n-1}min(a[i],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
- 上传者