POJ 3186Treats for the Cows(区间DP)
题目链接:http://poj.org/problem?id=3186
题目大意:给出的一系列的数字,可以看成一个双向队列,每次只能从队首或者队尾出队,第n个出队就拿这个数乘以n,最后将和加起来,求最大和。
解题思路:有两种写法:
①这是我一开始想的,从外推到内,设立数组dp[i][j]表示剩下i~j时的最优解,则有状态转移方程:
dp[i][j]=dp[i][j]=max(dp[i-1][j]+a[i-1]*(n-(j-i+1)),dp[i][j+1]+a[j+1]*(n-(j+1-i)))
最后推到dp[i][i]就只剩下一个物品,再计算一次找最大值即可。
②网上看的,区间DP,由内推到外,有状态转移方程:dp[i][j]=max(dp[i+1][j]+a[i]*(n-j+i),dp[i][j-1]+a[j]*(n-j+i))
代码①:
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N=2e3+;
const int inf=<<;
int a[N];
int dp[N][N];//还剩下i~j件物品时的最优解 int main(){
int n;
while(~scanf("%d",&n)){
for(int i=;i<=n;i++)
scanf("%d",&a[i]); dp[][]=dp[][]=;
for(int i=;i<=n;i++){
for(int j=n;j>=i-;j--){
dp[i][j]=max(dp[i-][j]+a[i-]*(n-(j-i+)),dp[i][j+]+a[j+]*(n-(j+-i)));
}
}
int ans=;
for(int i=;i<=n;i++){
ans=max(dp[i][i]+n*a[i],ans);
}
printf("%d\n",ans);
}
return ;
}
代码②:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e3+;
const int inf=<<;
int a[N];
int dp[N][N]; int main(){
int n;
while(~scanf("%d",&n)){
memset(dp,,sizeof(dp));
for(int i=;i<=n;i++)
scanf("%d",&a[i]); for(int i=n;i>=;i--){
for(int j=i;j<=n;j++){
dp[i][j]=max(dp[i+][j]+a[i]*(n-j+i),dp[i][j-]+a[j]*(n-j+i));
}
}
printf("%d\n",dp[][n]);
}
return ;
}
POJ 3186Treats for the Cows(区间DP)的更多相关文章
- POJ 3186Treats for the Cows (区间DP)
详见代码 #include <stdio.h> #include <algorithm> #include <string.h> using namespace s ...
- POJ 3280 Cheapest Palindrome(区间DP求改成回文串的最小花费)
题目链接:http://poj.org/problem?id=3280 题目大意:给你一个字符串,你可以删除或者增加任意字符,对应有相应的花费,让你通过这些操作使得字符串变为回文串,求最小花费.解题思 ...
- POJ3086 Treats for the Cows(区间DP)
题目链接 Treats for the Cows 直接区间DP就好了,用记忆化搜索是很方便的. #include <cstdio> #include <cstring> #i ...
- O - Treats for the Cows 区间DP
FJ has purchased N (1 <= N <= 2000) yummy treats for the cows who get money for giving vast am ...
- POJ 2955:Brackets(区间DP)
http://poj.org/problem?id=2955 题意:给出一串字符,求括号匹配的数最多是多少. 思路:区间DP. 对于每个枚举的区间边界,如果两边可以配对成括号,那么dp[i][j] = ...
- POJ 1191 棋盘分割(区间DP)题解
题意:中文题面 思路:不知道直接暴力枚举所有情况行不行... 我们可以把答案转化为 所以答案就是求xi2的最小值,那么我们可以直接用区间DP来写.设dp[x1][y1][x2][y2][k]为x1 y ...
- Poj 1651 Multiplication Puzzle(区间dp)
Multiplication Puzzle Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10010 Accepted: ...
- POJ 1651 Multiplication Puzzle (区间DP,经典)
题意: 给出一个序列,共n个正整数,要求将区间[2,n-1]全部删去,只剩下a[1]和a[n],也就是一共需要删除n-2个数字,但是每次只能删除一个数字,且会获得该数字与其旁边两个数字的积的分数,问最 ...
- POJ 1141 Brackets Sequence (区间DP)
Description Let us define a regular brackets sequence in the following way: 1. Empty sequence is a r ...
随机推荐
- [ACM][2018南京预赛]Sum
一.题面 样例输入: 2 5 8 样例输出: 8 14 二.思路 关键词:线性筛 在Zed的帮助下知道了这是一道线性筛的比较裸的题了.考试过程中肝这道题的时间最久,费了心思找到递推式后,发现根本不是在 ...
- joomla! 3.X 开发系列教程
http://www.mengyunzhi.com/members-resource/joomla/87-joomla-menu-study.html 学习地址 http://blog.csdn.ne ...
- bzoj3205 [Apio2013]机器人
3205: [Apio2013]机器人 Time Limit: 15 Sec Memory Limit: 128 MBSubmit: 953 Solved: 227[Submit][Status] ...
- 使用 css 的 keyframe 实现 loading 动画
效果查看:https://jsfiddle.net/rubys/je16qL5k/6/ <!DOCTYPE html> <html lang="en"> & ...
- jquery validate ajax 验证重复的2种方法
转载自:http://blog.51yip.com/jsjquery/1484.html jquery validate 经过这种多年的改良,已经很完善了.它能满足80%的验证需要,如果validat ...
- 关于变长数组的一点小想法-C语言定义数组但是数组长度不确定怎么办
很多数据机构,比如栈,链表等,都可以动态分配存储空间 那么数组呢?一般声明时都要指定数组长度,那么数组可以实现动态分配么? 假设数组存的是int型 那么 你先申请10个元素 int* a = (int ...
- asp.net实现access数据库分页
最近在编程人生上看到篇文章很有感触,觉得人生还是要多奋斗.今天给大家贡献点干货. <divclass="page"id="ctrlRecordPage"& ...
- 应用于网站导航中的 12 个 jQuery 插件
当考虑到网页设计时,导航被认为是使网页以用户友好方式展现的一个重要部分.在现代的交互网站中,导航起着至关重要的作用,如果没有正确地处理会影响你网站的访问.适当的导航工具能够帮助用户在网站的不同页面内容 ...
- IntelliJ Idea key shortcuts
>Default explaination Official IntelliJ Idea 常用快捷键列表 Shortcuts Ctrl+Shift + Enter,语句完成 "!&qu ...
- Node.js的开源博客系统Ghost搭建教程
准备工作 Node.js版本:0.10.x.0.12.x.4.2.x.安装步骤可参考:Node.js环境搭建 Ghost版本:0.7.4:中文集成版(33.6M),中文标准版(3.39M),英文原版( ...