【区间dp】Treats for the Cows POJ - 3186

xiaoxiao2021-02-28  95

/* 区间dp O - Treats for the Cows 题意:给你一组数,可以选择取最前面的数和最后面的数,第i次取到这个数, 就将总数加上(i*取的数),使总数最大。 题解:dp[i][j] 代表从i取到j的最大总数 dp[i][j] = max(dp[i+1][j]+a[i]*(n+i-j) , dp[i][j-1]+a[j]*(n+i-j)); */ #include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<map> using namespace std; const int N = 2010; int a[N]; int dp[N][N]; int main() { memset(dp,0,sizeof(dp)); int n; cin >> n; for(int i = 0; i < n; i++) cin >> a[i]; for(int len = 0; len < n; len++) { for(int i = 0; i+len < n; i++) { int l = i, r = i+len; dp[l][r] = max(dp[l+1][r]+a[l]*(n+l-r),dp[l][r-1]+a[r]*(n+l-r)); } } printf("%d\n",dp[0][n-1]); return 0; }
转载请注明原文地址: https://www.6miu.com/read-55621.html

最新回复(0)