poj(3186)——Treats for the Cows
2015-08-22 23:16
218 查看
题意:
现在告诉N个数,然后告诉你它们的价值v[i],你每次都可以从头或者尾部取出一个数字,并且加上它的价值,它的价值的计算方式是:v[i]*a(其中a代表的是第几天把它取出来的),现在你的目的就是为了使取出n个数的总价值和最大化。
思路:
一开始我的dp方程定义错了,所以导致有点推不下去。
应该定义为:dp[i][j],i代表从左边起取i个数,j代表从右边起取j个数,然后dp的定义是按照当前那种取法所能获得的最大价值。
注意这里i,j都代表的是取多少个数字。
状态转移方程为:dp[i][j]=max(dp[i-1][j]+v[i]*(i+j),dp[i][j-1]+v[n-j+1]*(i+j));
//我们这里的dp定义与区间dp有所不同,那种现在还不是很懂,以后补上
然后注意一下初始化就好了。
现在告诉N个数,然后告诉你它们的价值v[i],你每次都可以从头或者尾部取出一个数字,并且加上它的价值,它的价值的计算方式是:v[i]*a(其中a代表的是第几天把它取出来的),现在你的目的就是为了使取出n个数的总价值和最大化。
思路:
一开始我的dp方程定义错了,所以导致有点推不下去。
应该定义为:dp[i][j],i代表从左边起取i个数,j代表从右边起取j个数,然后dp的定义是按照当前那种取法所能获得的最大价值。
注意这里i,j都代表的是取多少个数字。
状态转移方程为:dp[i][j]=max(dp[i-1][j]+v[i]*(i+j),dp[i][j-1]+v[n-j+1]*(i+j));
//我们这里的dp定义与区间dp有所不同,那种现在还不是很懂,以后补上
然后注意一下初始化就好了。
#include<stdio.h> #include<string.h> #include<iostream> #include<set> #include<math.h> #include<map> #include<queue> #include<stack> #include<algorithm> using namespace std; #define maxn 2222 int v[maxn]; int dp[maxn][maxn]; int main(){ int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&v[i]); dp[1][0]=v[1]; dp[0][1]=v ; for(int i=0;i<=n;i++){ for(int j=0;j<=n;j++){ if(i>=1) dp[i][j]=max(dp[i-1][j]+v[i]*(i+j),dp[i][j-1]+v[n-j+1]*(i+j)); else dp[i][j]=max(dp[i][j],dp[i][j-1]+v[n-j+1]*(i+j)); } } int ans=-1; for(int i=0;i<=n;i++){ ans=max(ans,dp[i][n-i]); } printf("%d\n",ans); }
相关文章推荐
- CentOS 7中没有ifconfig命令,而且不能发现eth0
- 【玩转GridView】之隐藏域问题
- QtWebKit插件设计
- C#接扣和抽象类
- Linux运维职业路线(笔记)-- 马哥教育 张Sir
- POJ3579--Median
- 关于 Ubuntu 环境下 gvim 的安装与卸载问题
- 黑马程序员--Java基础学习(集合框架)第十五天
- CodeForces 185A - Plant
- 抽象工厂模式
- 名字的漂亮度
- 【HDOJ 5419】 Victor and Toys (排列组合)
- 美到窒息的词句
- Android多媒体编程(待续)
- Select count(*)和Count(1)的区别和执行方式
- java面试题笔记2015-08-22
- linux系统时钟和硬件时钟不一致
- 组建StarView管理拓扑
- listview notifyDataSetChanged()刷新显示
- hdoj 1022 Train problem 1【栈 的理解】