dp
正数第i个,倒数第j个;
dp[i][j]=max(dp[i-1][j]+val[i]*(i+j),dp[i][j-1]+val[n-j+1]*(j+i);
#include <iostream>
#include <cstdio>
using namespace std;
int val[2005];
int dp[2005][2005];
int main()
{
// freopen("in","r",stdin);
int n;
while(cin>>n)
{
for(int i=1;i<=n;i++)
{
scanf("%d",&val[i]);
}
int _max=0;
int i,j;
for(i=0;i<=n;i++)
{
for(j=0;j+i<=n;j++)
{
if(i==0&&j==0)
dp[i][j]=0;
else if(i==0&&j!=0)
dp[i][j]=max(dp[i][j],dp[i][j-1]+val[n-j+1]*(i+j));
else if(i!=0&&j==0)
dp[i][j]=max(dp[i][j],dp[i-1][j]+val[i]*(i+j));
else
dp[i][j]=max(dp[i-1][j]+val[i]*(i+j),dp[i][j-1]+val[n-j+1]*(i+j));
}
}
for(i=0;i<=n;i++)
{
if(_max<dp[i][n-i])
{
_max=dp[i][n-i];
}
}
printf("%d\n",_max);
}
return 0;
}
本文详细介绍了动态规划算法在解决寻找正数序列中第i个元素与倒数第j个元素最大值问题的应用。通过构建状态转移方程dp[i][j],利用前缀和与动态规划思想,实现高效求解。代码实例展示了如何使用C++实现这一算法,并通过实例验证了方法的有效性和正确性。
270

被折叠的 条评论
为什么被折叠?



