题目: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. OAF 获取页面路径

    --模糊查询某个页面 SELECT * FROM JDR_PATHS jp WHERE JP.PATH_NAME LIKE '%XXXX%'; --精确的查找过程 -- DocID --参数通过关于此 ...

  2. iOS UI-微博案例(通过代码自定义Cell)

    一.Model BWWeiBo数据模型 #import <Foundation/Foundation.h> @interface BWWeiBo : NSObject @property ...

  3. HDU 2895 贪心 还是 大水题

    DESCRIPTION:大意是给你两个字符串.编辑距离只有add和delete会产生.所以.编辑距离最短一定是两个字符串的长度差.然后...呵呵呵呵.... 猜题意就可以了...但是...我觉得这个题 ...

  4. JS之Callback function(回调函数)

    JS中的回调函数: 1.概念: 函数a有一个参数,这个参数是个函数b,当函数a执行完以后执行函数b,那么这个过程就叫回调,即把函数作为参数传入到另一个函数中,这个函数就是所谓的回调函数. 2.举例: ...

  5. [工作]双核系统struts-config.xml

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts-config PUBLIC & ...

  6. Python & PyCharm & Django 搭建web开发环境(续)

    由于Django自带轻量级的server,因此在前篇博文中,默认使用该server,但实际生产中是不允许这么干的,生产环境中通常使用Apache Httpd Server结合mod_wsgi.so来做 ...

  7. Python Django 前后端数据交互 之 前端向后端发送数据

    Python Django 之 前端向后端发送数据

  8. Delphi 项目 结构 文件夹 组织

    Delphi Project Structure Folder Organization http://delphi.about.com/od/delphitips2008/qt/project_la ...

  9. HDU 3998

    http://acm.hdu.edu.cn/showproblem.php?pid=3998 求LIS的长度,并且求有多少组互不相交的LIS 求组数用最大流 建图如下: if(dp[i]==1)add ...

  10. linux中文件上传下载

    windows篇 linux文件下载到windows sz命令 登录到linux服务器使用 sz log.log 命令,弹出对话框选择下载文件的目录,点击确定即可. windows文件上传到linux ...