题目:https://www.luogu.org/problemnew/show/P2530

dp或搜索。

dp做法就是 当前值+1 转移到 当前某一维为0、位置前进了c位 的地方。但没写。

写了搜索的方法。细节众多,而且RE地莫名其妙!

搜索要注意记忆化。

特别奇怪的细节:代码中用注释(d数组)代替t1 t2 t3的话就会WA。

子函数中传参如果写成c[ ],就是不确定大小,于是不能用memcpy了。

AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int INF=;
int n,col[],tmp[],f[][][][];
char ch;
int num(char ch)
{
if(ch=='A')return ;
if(ch=='B')return ;
if(ch=='C')return ;
}
int dfs(int c[],int now)
{
if(f[now][c[]][c[]][c[]])return f[now][c[]][c[]][c[]];
if(!c[]&&!c[]&&!c[])return ;
int num=INF,j=;
int t1=c[],t2=c[],t3=c[];
// int d[5]={0};
// memcpy(d,c,sizeof c);
// d[1]=c[1];d[2]=c[2];d[3]=c[3];
for(int i=;i<=;i++)
{
if(!c[i])continue;
int t=c[i];
c[i]=;
for(j=now;j<now+t&&j<=n;j++)
c[col[j]]++;
num=min(num,dfs(c,j));
c[]=t1;c[]=t2;c[]=t3;
// memcpy(c,d,sizeof d);
// c[1]=d[1];c[2]=d[2];c[3]=d[3];
}
return f[now][c[]][c[]][c[]]=num+;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf(" %c",&ch);
col[i]=num(ch);
if(i<=)tmp[col[i]]++;
}
printf("%d",dfs(tmp,min(,n+)));
return ;
}

RE+WA+MLE代码(注意判断return 0和记忆化的那两句的位置是在补满10个以后):

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int INF=;
int n,col[],tmp[],f[][][][];
char ch;
int num(char ch)
{
if(ch=='A')return ;
if(ch=='B')return ;
if(ch=='C')return ;
}
int dfs(int c[],int now)
{
int k=-c[]-c[]-c[];
for(int i=now;i<now+k&&i<=n;i++)
c[col[i]]++;
if(!c[]&&!c[]&&!c[]&&now>)return ;
if(f[now][c[]][c[]][c[]])return f[now][c[]][c[]][c[]];
int d[]={},num=INF;
// d[1]=c[1];d[2]=c[2];d[3]=c[3];
memcpy(d,c,sizeof c);
for(int i=;i<=;i++)
{
if(!c[i])continue;
c[i]=;
num=min(num,dfs(c,now+k));
c[i]=d[i];
}
return f[now][c[]][c[]][c[]]=num+;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf(" %c",&ch);
col[i]=num(ch);
}
printf("%d",dfs(tmp,));
return ;
}

代码2

改了改上边之后的WA代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int INF=;
int n,col[],tmp[],f[][][][];
char ch;
int num(char ch)
{
if(ch=='A')return ;
if(ch=='B')return ;
if(ch=='C')return ;
}
int dfs(int c[],int now,int k)
{
// int k=10-c[1]-c[2]-c[3],l=0;
int l=;
for(l=now;l<now+k&&l<=n;l++)
c[col[l]]++;
if(f[now][c[]][c[]][c[]])return f[now][c[]][c[]][c[]];
if(!c[]&&!c[]&&!c[])return ;
int num=INF,t1=c[],t2=c[],t3=c[];
// d[1]=c[1];d[2]=c[2];d[3]=c[3];
// memcpy(d,c,sizeof c);
for(int i=;i<=;i++)
{
if(!c[i])continue;
int t=c[i];
c[i]=;
num=min(num,dfs(c,l,t));
// c[i]=d[i];
c[]=t1;c[]=t2;c[]=t3;
}
return f[now][c[]][c[]][c[]]=num+;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf(" %c",&ch);
col[i]=num(ch);
}
printf("%d",dfs(tmp,,));
return ;
}

代码3

洛谷2530(codevs2098)化工厂装箱员的更多相关文章

  1. 洛谷 P2530 [SHOI2001]化工厂装箱员 解题报告

    P2530 [SHOI2001]化工厂装箱员 题目描述 118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B ...

  2. 洛谷P2530 [SHOI2001]化工厂装箱员

    题目描述 118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须把不 ...

  3. 洛谷 p2530 化工场装箱员(资源型)

    化工场装箱员 https://www.luogu.org/problem/show?pid=2530 118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的 ...

  4. 斜率优化dp学习笔记 洛谷P3915[HNOI2008]玩具装箱toy

    本文为原创??? 作者写这篇文章的时候刚刚初一毕业…… 如有错误请各位大佬指正 从例题入手 洛谷P3915[HNOI2008]玩具装箱toy Step0:读题 Q:暴力? 如果您学习过dp 不难推出d ...

  5. 化工厂装箱员(洛谷 P2530)

    题目描述 118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须 ...

  6. 化工厂装箱员 洛谷 p2530

    题目描述 118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须 ...

  7. Luogu 2530 化工厂装箱员

    Written with StackEdit. Description \(118\)号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有\(3\ ...

  8. [SHOI2001]化工厂装箱员

    题目描述 118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须 ...

  9. [SHOI2001]化工厂装箱员(dp?暴力:暴力)

    118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须把不同纯度 ...

随机推荐

  1. Logger.getLogger()和LogFactory.getLog()的区别

    第一.Logger.getLogger()和LogFactory.getLog()的区别 1.Logger.getLogger()是使用log4j的方式记录日志: 2.LogFactory.getLo ...

  2. Windows环境搭建ElasticSearch 5.*并配置head

    前言: ES5*以上版本需要jdk1.8,jdk1.8,jdk1.8.重要的事情说三遍 1.下载ElasticSearch https://www.elastic.co/cn/downloads/el ...

  3. hadoop kafka install multi-borker (7)

    multi-borker function like cluster technology First we make a config file for each of the brokers (o ...

  4. openSUSE 12.3 默认启动项

    修改默认opensuse12.3的默认启动项目(grub2). vim /boot/grub2/grubenv 里面有一条: saved_entry=openSUSE 12.3 修改为saved_en ...

  5. c#重写和重载的区别?重写和重载的意义?

    重写: 要求方法名.参数合返回值相同: 意义:重写是为了增强类的重用性和复用性,扩展性:重写是对类中方法的扩充,因为继承用的是父类的东西,重写则不仅得到父类的东西,同时也加入了自己的东西. 方法重写的 ...

  6. Alpha阶段项目复审

    队名 优点 缺点 名次 大马猴队 出现BUG修复时间短:针对初期用户需求的分析缺点能够快速更正,针对用户痛点实现了功能:开发的过程中削减了无用的功能,源代码管理比较好,更改能够及时提交,相关成员都有参 ...

  7. easyui datagrid 诡异的无法显示问题

    举个应用场景的例子来说明: 在采购单的编辑页面,上方为采购单自身的属性信息,下方使用tabs控件,加入两个tab页,分别为采购明细列表(DataGrid)和审核记录列表(DataGrid),即一个主业 ...

  8. <二叉树的基本操作>

    #include<stdio.h> #include<stdlib.h> #include<string.h> #define num 100 #define OK ...

  9. header 输出原始的php报头文件

    header() 函数向客户端发送原始的 HTTP 报头. 认识到一点很重要,即必须在任何实际的输出被发送之前调用 header() 函数 (在 PHP 4 以及更高的版本中,您可以使用输出缓存来解决 ...

  10. WinRAR 0day漏洞 附利用过程

    英国安全机构Mohammad Reza Espargham的漏洞实验室发现,流行压缩工具WinRAR 5.21最新版里存在一个安全漏洞,目前该漏洞还属于零日漏洞,同时官方正在全力修补该漏洞.同时报告该 ...