开一个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的更多相关文章

  1. 【dp】 比较经典的dp poj 1160

    转自http://blog.sina.com.cn/s/blog_5dd8fece0100rq7d.html [题目大意]:用数轴描述一条高速公路,有V个村庄,每一个村庄坐落在数轴的某个点上,需要选择 ...

  2. poj 1050 To the Max 最大子矩阵和 经典dp

    To the Max   Description Given a two-dimensional array of positive and negative integers, a sub-rect ...

  3. POJ 1160:Post Office 邮局经典DP

    Post Office Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 17168   Accepted: 9270 Desc ...

  4. HDU 1003 Max Sum --- 经典DP

    HDU 1003    相关链接   HDU 1231题解 题目大意:给定序列个数n及n个数,求该序列的最大连续子序列的和,要求输出最大连续子序列的和以及子序列的首位位置 解题思路:经典DP,可以定义 ...

  5. poj1458 求最长公共子序列 经典DP

    Common Subsequence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 45763   Accepted: 18 ...

  6. NYOJ - 矩形嵌套(经典dp)

    矩形嵌套时间限制:3000 ms | 内存限制:65535 KB 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b< ...

  7. 51nod 1412 AVL树的种类(经典dp)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1412 题意: 思路: 经典dp!!!可惜我想不到!! $dp[i][k] ...

  8. NYOJ 16 矩形嵌套(经典DP)

    http://acm.nyist.net/JudgeOnline/problem.php?pid=16 矩形嵌套 时间限制:3000 ms  |           内存限制:65535 KB 难度: ...

  9. CS Academy Distinct Neighbours(经典dp)

    CS Academy Distinct Neighbours(经典dp) 题意: 求相邻无相同数字的合法的排列数 题解: 题解 先将相同的数字分为一类,假设共有n组 定义\(dp[i][j]\)表示前 ...

  10. 【经典dp 技巧】8.13序列

    经典的拆绝对值 题目大意 给定$n$个具有顺序的序列,允许对每个序列循环移动.记第$i$个序列尾元素为$x$,$i+1$个序列首元素为$y$,定义其连接收益为$|x-y|*i$,求$n$个序列连接最大 ...

随机推荐

  1. hdu_5881_Tea(xjb猜)

    题目链接:hdu_5881_Tea 题意: 有一壶水, 体积在 L 和 R 之间, 有两个杯子, 你要把水倒到两个杯子里面, 使得杯子水体积几乎相同(体积的差值小于等于1), 并且使得壶里剩下水体积不 ...

  2. onSaveInstanceState()和onRestoreInstanceState()方法

    Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它们不同于 onCreate().onPause()等生命周期方 ...

  3. CMake VS工程总结

    1.设置输出后缀 set(CMAKE_DEBUG_POSTFIX "d") 2.设置输出目录 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_ ...

  4. Vultr\DigitalOcean\Linode速度最快的vps机房推荐

    对大陆用户来说,香港.新加坡.韩国.台湾.日本,地理位置近,机房速度快.香港地区带宽成本太高,小水管跑不起来,没有性价比.韩国机房带宽充足,但成本也高.新加坡机房量少,像oneasiahost经常无法 ...

  5. idea 切换新项目 新窗口 原窗口

    选择 file--setting. 在新打开的窗口中选择 Appearance & Behavior--System Settings 点 Confirm window to open pro ...

  6. SharePoint2013 Excel导出好的代码

    C#Excel操作类ExcelHelper.cs 来源:http://www.hellocsharp.com/article/67.aspx C#源码世界 发布于: 2014-09-12 使用本类之前 ...

  7. C# for循环嵌套

    今天,我主要学习了for循环的嵌套. 第一个部分主要学习了打印直角在不同方向的三角形,求阶乘的和以及打印九九乘法表等. 例:打印直角在左下角的三角形. Console.WriteLine(" ...

  8. LibRTMP优化之调整输出块大小

    1. 为什么要调整输出块大小 首先在RTMP_Connect0函数中LibRTMP是关闭了Nagle算法这个TCP选项的,为了实时性这样做是好的,但是要注意到LibRTMP的结构体RTMP的成员是有m ...

  9. Django 基础知识

    Django Models django 本身提供了非常强大易使用的ORM组件,并且支持多种数据库,如sqllite,mysql,progressSql,Oracle等,当然最常用的搭配还是mysql ...

  10. iOS9如何隐藏各种bar

    转载自:http://www.cnblogs.com/aBigRoybot/articles/2234487.html 状态条StatusBar 1 [UIApplication sharedAppl ...