poj3186(区间dp)
来源:互联网 发布:mac终端查询ip地址 编辑:程序博客网 时间:2024/06/05 14:15
题意:给一行n个数,每次可以取出行首或者行末的数,如果第ai是第i次取出的,可以得到ai*i的收益,求最大的总收益;
我们设dp[i][j],表示从i到j的最大收益。最后输出dp[1][n]即可。
那么对于dp[i][j],我们上一次拿出的肯定是i个或者第j个。
那么dp[i][j]=max( dp[i-1][j]+a[i]*(i+j) , dp[i][j-1]+a[n-j+1]*(i+j)) 注意第二个是n-j+1哦。 因为取尾巴会受到之前的影响的
- #include<stdio.h>
- #include<algorithm>
- using namespace std;
- int dp[2005][2005];
- int v[2005];
- int max(int a,int b)
- {
- if(a>b)
- return a;
- else
- return b;
- }
- int main()
- {
- int i,j,n;
- while(scanf("%d",&n)!=EOF)
- {
- for(i=1;i<=n;i++)
- scanf("%d",&v[i]);
- memset(dp,0,sizeof(dp));
- for(i=0;i<=n;i++)
- for(j=0;i+j<=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]+v[n-j+1]*(i+j));
- else if(i!=0&&j==0)
- dp[i][j]=max(dp[i][j],dp[i-1][j]+v[i]*(i+j));
- else
- dp[i][j]=max(dp[i-1][j]+v[i]*(i+j),dp[i][j-1]+v[n-j+1]*(i+j));
- }
- int ans=0;
- for(i=0;i<=n;i++)
- if(dp[i][n-i]>ans)
- ans=dp[i][n-i];
- printf("%d/n",ans);
- }
- return 0;
- }
阅读全文
0 0
- POJ3186【区间DP】
- poj3186(区间dp)
- POJ3186:Treats for the Cows(区间DP)
- POJ3186:Treats for the Cows 区间DP
- POJ3186:Treats for the Cows(区间DP)
- POJ3186:Treats for the Cows(区间DP)
- poj3186 dp
- dp poj3186
- POJ3186迷之DP
- 区间dp入门[POJ2955][HDU2476][POJ3186][POJ1651][HDU4632][HDU4283][HDU4570][POJ3280]
- poj3186
- POJ3186
- POJ3186 Treats for the Cows DP
- 区间DP
- 区间DP
- 区间DP
- 区间DP
- ##区间dp##
- Java3+1种修饰符
- 蓝桥杯练习题 字母图形 java实现
- 擦除效果
- OSI七层与TCP/IP五层网络架构
- 清北day1(cubicp)
- poj3186(区间dp)
- IT大牛养成指南(一鸣惊人背后是1万小时的不断练习)
- Next Greater Element I(leetcode)
- Java设计模式(5)之观察者模式学习总结
- 【OpenCV入门教程之一】 安装OpenCV:OpenCV 3.0、OpenCV 2.4.8、OpenCV 2.4.9 +VS 开发环境配置
- 简单学生类
- java中队列的使用
- 使用Voovan进行字节流通信
- JDBC之简单的读取表字段名