朴素动态规划

ZOJ3161



题意:(严重标题党)老板不想让客人走,客人不想留,客人按顺序排好,老板抽8g(书上翻译成八卦,神翻译),抽到的

如果相邻,其中一个人由客人决定离开,求最后黑心的老板最多能让多少人留下。



输入:

n(客人个数),m(8g关系对数)

a(客人a),b(客人b)(m行)



输出:

T(最多留下的人数)

思路:之前看题目的时候看懂了,但压根想不出来怎么用dp做,因为我考虑到既然老板要求最多人,而且走人的时候又由客人来选择谁走,那么情况应该很复杂(后来证明我想多了),书上的算法分析是这样说的,整个序列可以分成一些独立的部分,每一个部分相邻的两个人都有8g,并且互不影响(当时就一直在纠结这里),然后我想了下,如果可以分成很多序列的话,要做预处理,先解出F[i]这个状态i个人这样的序列有多少,用数组存放,然后dp,dp方程其实就是判定i个人状态下,

最多有多少个人能留下来,如果我们假设枚举的是第j个人,那么相邻的就是j和j+1,所以如果走的是j,j-1和i-j代表的就是除去j后的状态,而j和i-(j+1)就是除去j+1后的状态,选取较小的和状态i比较,然后最大的就是最优的结果。最后因为dp保存的是单个序列下能留下的最大人数,所以前面预处理的数组要用上。

#include<iostream>
#include <stdio.h>
#include <cstring>
#include <cmath>
using namespace std;
#define MAX 505
int F[MAX];
int flag[MAX];
int n,m;
int main()
{ int index_t[MAX][MAX];
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(flag,0,sizeof(flag));
memset(index_t,0,sizeof(index_t));
memset(F,0,sizeof(F));
for(int i=1; i<=m; i++)
{
int a,b;
scanf("%d%d",&a,&b);
if(abs(a-b)==1)
{
index_t[a+1][b+1]=1;
index_t[b+1][a+1]=1;//预处理
}
}
for(int i=1; i<=n; i++)
{
int count=1;
while(index_t[i][i+1])
{
count++;
i++;
}
flag[count]++;
}
F[0]=0;
F[1]=1;
F[2]=1;
F[3]=1; for(int i=4; i<=n; i++)
for(int j=1; j<i; j++)
F[i]=max(F[i],min(F[j]+F[i-j-1],F[j-1]+F[i-j])); int ans=flag[1];
for(int i=2; i<=n; i++)
ans+=flag[i]*F[i];
printf("%d\n",ans);
}
return 0;
}

ZOJ3161的更多相关文章

  1. zoj3161 Damn Couples

    不想打题面了,题面戳这里 这道题目的模型转换地有点猛.首先我们肯定需要让老板把那些不相邻的人的卡牌放在前面,这样他们就作废了.然后剩下的卡牌就都是相邻人之间的了.我们就可以把这个序列分成若干个联通块, ...

随机推荐

  1. sql编程 1

    declare emp_count number;begin select count(*) into emp_count from emp where HIOREDATE >= TO_DATE ...

  2. MongoDB-启动的时候出现了问题

    之前MongoDB启动的时候是正常的,不知道后来启动报错了,就把粘贴出来查询了.最后才知道是由于自己不正常的关闭导致的这个情况. --摘录:MongoDB非正常关闭后修复记录 mongod没有后台执行 ...

  3. 【行为型】State模式

    状态模式其意图是在一个对象的状态发生变化时能够同时改变它的行为.一个生活中比较常见的例子就如你(是指你自己本人)在走时时,整个人全身的动作是双手臂前后慢慢摇摆且双脚也是一步一步慢慢往前移的,即:该走路 ...

  4. Python学习笔记:02数据类型

    Python 数据类型 python中标准的数据类型有 基础类型 整型(长整型) 浮点型 复数型 布尔型 序列类型 字符串 列表 元组 字典 整型 整型和长整型并不严格区分,整型int的表达范围和计算 ...

  5. sql如何向一个表中批量插入大量数据

    --如果是一个表插入另外一个表.insert into tb1 需要的列名 select 按照前面写上需要的列名 from tb2 --如果两表结构一样.insert into tb1 * selec ...

  6. traceroute命令

    traceroute指令让你追踪网络数据包的路由途径,预设数据包大小是40Bytes,用户可另行设置. 通过traceroute我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径.当然每次 ...

  7. oracle insert &字符插入问题

    例如执行一下语句: insert into NSRXT_SP (SP_ID, SP_TITLE, SP_DESC, SP_URL, SP_TYPE, SP_SUB_TYPE, ADD_TIME, CZ ...

  8. 使用MFC开发有十多年了,结合自身的体会,随便说几句(不能样样都依赖别人,C体系的人,绝对不怕人踢馆)

    挺长时间了吧,这个帖子还没沉下去,使用MFC开发有十多年了,结合自身的体会,随便说几句:1.MFC是一个C++的基础类库,封装了绝大多数的API函数,主要是用来创建带UI的应用程序,服务端程序或着不带 ...

  9. go官网教程A Tour of Go

    http://tour.golang.org/#1 中文版:http://go-tour-cn.appsp0t.com/#4 package main import ( "fmt" ...

  10. 基于ffmpeg网络播放器的教程与总结

    基于ffmpeg网络播放器的教程与总结   一.         概述 为了解决在线无广告播放youku网上的视频.(youku把每个视频切换成若干个小视频). 视频资源解析可以从www.flvcd. ...