1. 程式人生 > >【USACO習題】奶牛零食

【USACO習題】奶牛零食

本題在洛谷上的連結:https://www.luogu.org/problemnew/show/P2858


 

算是一道區間DP的水題,很容易設計出狀態dp[i][j]表示[i,j]所能產生的最大價值,那麼有dp[i][j]=max(dp[i+1][j]+v[i]*(n-l+1),dp[i][j-1]+v[j]*(n-l+1));

注意,這裡相當於將元素新增到序列中,因此最先加入的反而是出售較晚的,同時,不難得出初始邊界,dp[i][i]=n*v[i]。

 1 #include <cstdio>
 2 #include <algorithm>
 3
4 using namespace std; 5 6 const int maxn = 2005; 7 8 int v[maxn], dp[maxn][maxn]; 9 10 int main() { 11 int n; 12 scanf("%d", &n); 13 for (int i = 1; i <= n; ++i) 14 scanf("%d", &v[i]); 15 for (int i = 1; i <= n; ++i) 16 dp[i][i] = v[i] * n;
17 for (int l = 2; l <= n; ++l) 18 for (int i = 1; i <= n - l + 1; ++i) { 19 int j = i + l - 1; 20 dp[i][j] = max(dp[i + 1][j] + v[i] * (n - l + 1), dp[i][j - 1] + v[j] * (n - l + 1)); 21 } 22 printf("%d", dp[1][n]); 23 return 0; 24 }
AC程式碼