博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
fzu 2253 salty fish
阅读量:5154 次
发布时间:2019-06-13

本文共 1197 字,大约阅读时间需要 3 分钟。

https://vjudge.net/problem/FZU-2253

题意:略

思路:

一开始改变区间,还以为是线段树。。。还是dp的题做得太少了。

这题一开始我们可以统计出一共有多少只翻身的咸鱼,对于每一个位置上,如果是1,那么改变它,翻身咸鱼数少1,如果是0,那么就加1。所以,就可以直接利用动态规划,dp[i]表示翻转到第i位时的翻身的增加数目,可能为负,因为至少翻转一只鱼。转移方程dp[i] = max(tmp,dp[i-1] + tmp),tmp表示当前的格子是翻还是不翻。切记ans一开始必须等于dp[0],dp[0]取决于第一个格子是翻还是不翻。一开始直接把ans赋值为0,wa了无数次。比如当序列为 1 1 1 1 1时,ans = 0的答案是5,但是正确答案应该是4。

代码:

1 #include 
2 #include
3 #include
4 using namespace std; 5 6 int a[100005],dp[100005]; 7 8 int main() 9 {10 int n;11 12 while (scanf("%d",&n) != EOF)13 {14 int num = 0;15 16 for (int i = 0;i < n;i++)17 {18 scanf("%d",&a[i]);19 20 if (a[i] == 1) num++;21 }22 23 24 if (a[0] == 1) dp[0] = -1;25 else dp[0] = 1;26 27 int ans = dp[0];28 29 for (int i = 1;i < n;i++)30 {31 int tmp;32 33 if (a[i] == 1) tmp = -1;34 else tmp = 1;35 36 dp[i] = max(tmp,dp[i-1] + tmp);37 38 ans = max(ans,dp[i]);39 }40 41 printf("%d\n",ans + num);42 }43 44 return 0;45 }

 

转载于:https://www.cnblogs.com/kickit/p/7220366.html

你可能感兴趣的文章
写接口请求类型为get或post的时,参数定义的几种方式,如何用注解(原创)--雷锋...
查看>>
【OpenJ_Bailian - 2287】Tian Ji -- The Horse Racing (贪心)
查看>>
Java网络编程--socket服务器端与客户端讲解
查看>>
List_统计输入数值的各种值
查看>>
学习笔记-KMP算法
查看>>
Timer-triggered memory-to-memory DMA transfer demonstrator
查看>>
跨域问题整理
查看>>
[Linux]文件浏览
查看>>
64位主机64位oracle下装32位客户端ODAC(NFPACS版)
查看>>
获取国内随机IP的函数
查看>>
今天第一次写博客
查看>>
江城子·己亥年戊辰月丁丑日话凄凉
查看>>
IP V4 和 IP V6 初识
查看>>
Spring Mvc模式下Jquery Ajax 与后台交互操作
查看>>
(转)matlab练习程序(HOG方向梯度直方图)
查看>>
『Raid 平面最近点对』
查看>>
【ADO.NET基础-数据加密】第一篇(加密解密篇)
查看>>
C语言基础小结(一)
查看>>
STL中的优先级队列priority_queue
查看>>
UE4 使用UGM制作血条
查看>>