题意:你有n个货物从1-n依次排列,每天可以从两侧选一个出来卖,卖的价格是当天的天数乘该货物的初始价格,问这批货物卖完的最大价格
输入:第一行n,之后是n个货物的初始价值
这道题不能用贪心做,因为可能存在右端点非常大,但其左边的数非常小, 但因为右端点太大而没被及时卖出
如:9 9 9 1 1 10
贪心:sum=9*1+9*2+9*3+1*4+1*5+10*6=123
而正解为150,也就是说这个题当前的决策会影响到后面的一些决策,不能贪心
dp[i][j]是区间i到j的货物卖完的最大价格
DP的话第一层循环长度,第二层循环左端点
#include <bits/stdc++.h> using namespace std; const double pi=acos(-1); const int mod=1e9+7; const int maxn=2010; const int inf=1<<30; typedef long long ll; int v[maxn]; int dp[maxn][maxn]; int main(){ int n;scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&v[i]); for(int i=1;i<=n;i++)dp[i][i]=v[i]*n; for(int i=2;i<=n;i++){ for(int l=1;(l+i-1)<=n;l++){ int r=l+i-1; dp[l][r]=max(dp[l+1][r]+(n-i+1)*v[l],dp[l][r-1]+(n-i+1)*v[r]); } } cout<<dp[1][n]<<endl; return 0; }