【经典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$个序列连接最大 ...
随机推荐
- 《JS权威指南学习总结--6.8对象的三个属性》
内容要点: 每一个对象都有与之相关的原型(prototype).类(class)和可扩展性 一.原型属性 1.对象的原型属性是用来继承属性的,这个属性是如此重要,以至于我们经常把 "0的原型 ...
- 《JS权威指南学习总结--6.3删除属性》
内容要点: 一.delete运算符可以删除对象的属性.它的操作数应当是一个属性访问表达式.让人感到意外的是,delete只是断开属性和宿主对象的联系,而不会去操作属性中的属性: delete book ...
- (转)了解JNDI
JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一,不少专家认为,没有透彻理解JNDI的意义和作用,就没有 ...
- MongoDB高级操作
参考MongoDB菜鸟教程 一.$type操作符 MongoDB 中可以使用的类型如下表所示: 类型 数字 备注 Double 1 String 2 Object 3 Array 4 ...
- Android常用Permission
位置相关: android.permission.WRITE_GSERVICES 允许程序修改Google服务地图(Allows an application to modify the Google ...
- Maxmum subsequence sum problem
We have a lot of ways to solve the maximum subsequence sum problem, but different ways take differen ...
- agnentX学习存在疑问?
在RFC2741中这样定义: 4.3中有如下段落: A general architectural division of labor between master agent and subage ...
- aspnet5备忘
1. 在Windows下面运行cmd,然后执行下面的命令 @powershell -NoProfile -ExecutionPolicy unrestricted -Command "&am ...
- Cross Product
Cross Product These are two vectors: They can be multiplied using the "Cross Product" (als ...
- NOIP2005-普及组复赛-第三题-采药
题目描述 Description 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山 ...