1743: 取数游戏II(New Online Judge)
题目描述
给定一个长度为n的数组a,每次从数组头或者尾取一个数字,第i次取数的得分等于被取元素值* i 2 i^2 i2。
最终总得分等于每次得分之和。求最大得分是多少。
输入
输入第一行为正整数n(n≤1000)
第二行包含n个正整数表示数组a(1≤ai≤100000)
输出
对于每组测试数据,输出一行表示答案。
样例输入
3
1 3 2
样例输出
36
题解1(C++版本)
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int a[1010], n;
LL dp[1010][1010]; //dp[L][R]表示对区间[L,R]中的取数的最大的得分之和
LL dfs(int L, int R, int cnt){ // cnt表示第cnt次取数
if(L == R){
dp[L][R] = 1LL*a[L] * (cnt*cnt);
return dp[L][R];
}
if(dp[L][R]) return dp[L][R]; //记忆化搜索,避免对同一个区间取数重复计算
dp[L][R] = max(dfs(L + 1, R, cnt + 1) + 1LL*a[L]*(cnt*cnt),dfs(L, R - 1, cnt + 1) + 1LL*a[R]*(cnt*cnt));
return dp[L][R];
}
int main(){
scanf("%d", &n);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
printf("%lld\n", dfs(1, n, 1));
return 0;
}