POJ 3186 Treats for the Cows ——(DP)
2024-09-05 04:23:14
第一眼感觉是贪心,,果断WA。然后又设计了一个两个方向的dp方法,虽然觉得有点不对,但是过了样例,交了一发,还是WA,不知道为什么不对= =,感觉是dp的挺有道理的,,代码如下(WA的):
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
const int N = + ; int a[N];
int dp[N][N];
int n; int getDay(int i,int j)
{
return n - (j - i) + ;
} int main()
{
while(scanf("%d",&n) == )
{
for(int i=;i<=n;i++) scanf("%d",a+i);
memset(dp,,sizeof dp);
for(int i=;i<=n;i++)
{
for(int j=i+;j<=n+;j++) dp[i][j] = max(dp[i][j], dp[i-][j] + getDay(i,j) * a[i]);
}
for(int j=n+;j>=;j--)
{
for(int i=j-;i>=;i--) dp[i][j] = max(dp[i][j], dp[i][j+] + getDay(i,j) * a[j]);
}
int ans = ;
for(int i=;i<=n;i++) ans = max(ans, dp[i][i+]);
printf("%d\n",ans);
}
return ;
}
WA的DP
看了别人的博客以后,有一个不错的dp方法:dp[i][j]表示左边已经选了i个右边已经选了j个最大值,然后转移也很明显。AC代码如下:
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
const int N = + ; int a[N];
int dp[N][N];
int n; int main()
{
while(scanf("%d",&n) == )
{
for(int i=;i<=n;i++) scanf("%d",a+i);
memset(dp,,sizeof dp);
for(int i=;i<=n;i++)
{
for(int j=;i+j<=n;j++)
{
if(i > ) dp[i][j] = max(dp[i][j], dp[i-][j] + a[i] * (i+j));
if(j > ) dp[i][j] = max(dp[i][j], dp[i][j-] + a[n-j+] * (i+j));
}
}
int ans = ;
for(int i=;i<=n;i++) ans = max(ans, dp[i][n-i]);
printf("%d\n",ans);
}
return ;
}
最新文章
- OpenGL渲染流程
- php 正则
- 互联网的寒冬来了,BAT都不社招了
- iphone 使用技巧
- Android TextView内容过长加省略号,点击显示全部内容
- div模拟的下拉框特效jquery
- 【转载】Android Studio 设置内存大小及原理
- Learning Cocos2d-x for WP8(8)——动作Action
- 不用char*作为hash_map的key
- 参加IMWebConf 2017 前端开发者大会是什么体验?
- 转深入理解 AngularJS 的 Scope作用域
- RestTemplate的逆袭之路,从发送请求到负载均衡
- c++ 实现拓扑排序
- Intellij IDEA 快捷键整理-鬼畜版(全键盘开发指南)
- Python集成开发环境搭建
- shell中执行hive命令错误:delimited by end-of-file (wanted `EOF&#39;)
- unity, 导出对象到另一个项目
- CDN专业一站式解决方案
- pig(转载)
- ffmpeg推送RTSP直播流到EasyDarwin报错问题的修复