【经典dp】 poj 3671
开一个dp[30010][3]的数组
其中dp[i][j]表示把第i个数改成j最少要花多少次
那么状态转移方程就列出来了:
令a=1 j!=a[i]
0 j==a[i]
那么dp[i][1]=dp[i-1][1]+a;
dp[i][2]=min(dp[i-1][1],dp[i-1][2])+a;
那么根据空间优化原理,我们的第一维的i不过是为了递推,那么可以优化掉。
不过要注意的是,dp【2】的状态要先求,否则测试数据会是3,因为沿用了本次的dp【1】,而非上次的dp【1】。
#include <iostream>
#include <cstdio>
#include <iostream>
#include <cstdio>
#include <memory.h>
using namespace std;
const int maxn=;
//int dp[maxn][3];
int dp[maxn];
int cow[maxn];
int main()
{
// freopen("in.txt","r",stdin);
int n;
cin >> n;
for(int i=;i<=n;i++)
{
cin >> cow[i];
int flag;
if(cow[i]==)
flag=;
else flag=;
//dp[i][2]=min(dp[i-1][1],dp[i-1][2])+flag;
dp[]=min(dp[],dp[])+flag;
if(flag==)flag=;
else flag=;
// dp[i][1]=dp[i-1][1]+flag;
dp[]=dp[]+flag;
}
//cout << min(dp[n][1],dp[n][2])<< endl;
cout << min(dp[],dp[])<< endl;
return ;
}
左右遍历,计算left【i】+right【i】的max:
#include <iostream>
#include <cstdio>
#include <iostream>
#include <cstdio>
#include <memory.h>
using namespace std;
#define maxn 30002
int s[maxn],l[maxn],r[maxn];
int main()
{
//freopen("in.txt","r",stdin);
memset(s,,sizeof(s));
memset(l,,sizeof(l));
memset(r,,sizeof(r));
int n;
cin >> n;
for(int i=;i<=n;++i)
{
cin >> s[i];
}
if(s[]==)
{
l[]=;
}
for(int i=;i<=n;i++)
{
if(s[i]==)
{
l[i]=l[i-]+;
}
else l[i]=l[i-];
}
if(s[n]==)
{
r[n]=;
}
for(int i=n-;i>=;i--)
{
if(s[i]==)
{
r[i]=r[i+]+;
}
else r[i]=r[i+];
}
int max=;
for(int i=;i<=n;i++)
{
if(l[i]+r[i]>max)
{
max=l[i]+r[i];
}
}
cout << n-max << endl;
return ;
}
还有一个不错的方法,我们先计算1的个数,然后从前遍历,每次判断:是2就自加1,不是就自减1,其中保存min,则为结果。实际上也为dp,每次的i值代表,编号为i的数组前面不可更改的数字1个数。
#include <iostream>
#include <cstdio>
using namespace std;
const int MAX=+;
int a[MAX]; //存储输入的串
int main()
{
//freopen("in.txt","r",stdin);
int cnt; //数组元素的个数
int i; int min; //最少要改变的次数
scanf("%d",&cnt);
int num1=;
for (i=;i<cnt;i++)
{
scanf("%d",&a[i]);
if (a[i] == )
num1++;
} min=num1;
for (i=;i<cnt;i++)
{
(a[i] == ) ? num1-- : num1++;
if (min > num1) min = num1;
}
printf("%d\n",min);
return ;
}
【经典dp】 poj 3671的更多相关文章
- 【dp】 比较经典的dp poj 1160
转自http://blog.sina.com.cn/s/blog_5dd8fece0100rq7d.html [题目大意]:用数轴描述一条高速公路,有V个村庄,每一个村庄坐落在数轴的某个点上,需要选择 ...
- poj 1050 To the Max 最大子矩阵和 经典dp
To the Max Description Given a two-dimensional array of positive and negative integers, a sub-rect ...
- POJ 1160:Post Office 邮局经典DP
Post Office Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 17168 Accepted: 9270 Desc ...
- HDU 1003 Max Sum --- 经典DP
HDU 1003 相关链接 HDU 1231题解 题目大意:给定序列个数n及n个数,求该序列的最大连续子序列的和,要求输出最大连续子序列的和以及子序列的首位位置 解题思路:经典DP,可以定义 ...
- poj1458 求最长公共子序列 经典DP
Common Subsequence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 45763 Accepted: 18 ...
- NYOJ - 矩形嵌套(经典dp)
矩形嵌套时间限制:3000 ms | 内存限制:65535 KB 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b< ...
- 51nod 1412 AVL树的种类(经典dp)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1412 题意: 思路: 经典dp!!!可惜我想不到!! $dp[i][k] ...
- NYOJ 16 矩形嵌套(经典DP)
http://acm.nyist.net/JudgeOnline/problem.php?pid=16 矩形嵌套 时间限制:3000 ms | 内存限制:65535 KB 难度: ...
- CS Academy Distinct Neighbours(经典dp)
CS Academy Distinct Neighbours(经典dp) 题意: 求相邻无相同数字的合法的排列数 题解: 题解 先将相同的数字分为一类,假设共有n组 定义\(dp[i][j]\)表示前 ...
- 【经典dp 技巧】8.13序列
经典的拆绝对值 题目大意 给定$n$个具有顺序的序列,允许对每个序列循环移动.记第$i$个序列尾元素为$x$,$i+1$个序列首元素为$y$,定义其连接收益为$|x-y|*i$,求$n$个序列连接最大 ...
随机推荐
- 使用EasyBCD 从硬盘安装 deepin2014.1
EasyBCD config code: title Install Deepin2014 root (hd0,1) kernel (hd0,1)/vmlinuz boot=casper iso-s ...
- Llinux环境下编译并使用OpenCV
http://docs.opencv.org/2.4/doc/tutorials/introduction/linux_install/linux_install.html http://stacko ...
- Asp.NET路由管道处理过程 【重要】
当ASP.NET处理请求时,路由管道主要由以下几个步骤组成: 1.UrlRoutingModule尝试使用RouteTable中注册的理由匹配当前请求: 2.如果RouteTable中有一个路由成功匹 ...
- ElasticSearch(2)-文档
上一篇 ES(1) 官网原地址:https://www.elastic.co/guide/en/elasticsearch/reference/1.7/_cluster_health.html ES权 ...
- PHP中使用CURL(四)
为了安全,我们的web服务主机往往不能上网.维护的时候,也是通过跳板机,ssh登录后去操作.有时候我们的程序需要访问外网.比如需要调用外网其他程序的某个接口.这时可以通过PHP的CURL函数的CURL ...
- 移动端touch事件影响click事件的相关解决方法
preventDefault()的方法,阻止事件的默认行为. 在移动端,手指点击一个元素,会经过:touchstart --> touchmove -> touchend -->cl ...
- strace -o /tmp/dhc$$ dhclient -d eth2
http://askubuntu.com/questions/5187/why-is-dhclient-saying-siocsifaddr-permission-denied ip link add ...
- 多线程synchronized用例解析
当用synchronized来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码.即使在执行过程中,CPU切换到别的线程了,因为有锁的缘故,其他线程也不会进来执行代码,而 ...
- 学习multiprocessing(2)
1 代码1: from multiprocessing import Pool import os, time, random def long_time_task(name): print('Run ...
- Google Developing for Android 学习总结
避免在循环中使用内存 也可理解为在循环中尽可能少创建对象,自定义控件避免在ondraw里面频繁创建paint对象. 尽可能避免内存分配 对象缓存: 常量通过类级别或者静态来进行缓存. 对象池: 同 ...