poj3186(递推)

来源:互联网 发布:浙江海正药业待遇知乎 编辑:程序博客网 时间:2024/06/09 15:36

链接:点击打开链接

题意:给定一串数列,每次只可以从两端取数,第一次取得乘1,第二次乘2,以此类推问当所有数取完时和最大是多少

代码:

#include <stdio.h>#include <string.h>#include <stdlib.h>#include <iostream>#include <algorithm>using namespace std;long long a[2005],dp[2005][2005];int main(){                                     //dp[i][j]代表从左边取i个从右边取i个    long long i,j,n,ans;                            while(scanf("%I64d",&n)!=EOF){        for(i=0;i<n;i++)        scanf("%I64d",&a[i]);        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)                   //左边不取和右边不取需要特殊处理                dp[i][j]=dp[i][j-1]+a[n-j]*j;                else if(j==0)                dp[i][j]=dp[i-1][j]+a[i-1]*i;                else                            //只有dp[i-1][j]和dp[i][j-1]能推出dp[i][j]                dp[i][j]=max(dp[i-1][j]+a[i-1]*(i+j),                             dp[i][j-1]+a[n-j]*(i+j));            }        }        ans=0;        for(i=0;i<=n;i++)        ans=max(ans,dp[i][n-i]);        printf("%I64d\n",ans);    }    return 0;}


 

0 0
原创粉丝点击