题目: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=1005;
int n,col[105],tmp[5],f[105][15][15][15];
char ch;
int num(char ch)
{if(ch=='A')return 1;if(ch=='B')return 2;if(ch=='C')return 3;
}
int dfs(int c[5],int now)
{if(f[now][c[1]][c[2]][c[3]])return f[now][c[1]][c[2]][c[3]];if(!c[1]&&!c[2]&&!c[3])return 0;int num=INF,j=0;int t1=c[1],t2=c[2],t3=c[3];
//    int d[5]={0};
//    memcpy(d,c,sizeof c);
//    d[1]=c[1];d[2]=c[2];d[3]=c[3];for(int i=1;i<=3;i++){if(!c[i])continue;int t=c[i];c[i]=0;for(j=now;j<now+t&&j<=n;j++)c[col[j]]++;num=min(num,dfs(c,j));c[1]=t1;c[2]=t2;c[3]=t3;
//        memcpy(c,d,sizeof d);
//        c[1]=d[1];c[2]=d[2];c[3]=d[3];
    }return f[now][c[1]][c[2]][c[3]]=num+1;
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){scanf(" %c",&ch);col[i]=num(ch);if(i<=10)tmp[col[i]]++;}printf("%d",dfs(tmp,min(11,n+1)));return 0;
}

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

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

代码2

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

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

代码3

转载于:https://www.cnblogs.com/Narh/p/8671785.html

洛谷2530(codevs2098)化工厂装箱员相关推荐

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

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

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

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

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

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

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

    毒瘤dp,熬了一上午 有一个显然的事情就是,我们肯定会把手中所有A或所有B或所有C全部装箱,对吧? 然后我们就枚举这一次装箱是将手中所有的3种物品中的一个装箱,然后取min 代码 //By AcerM ...

  5. 【SHOI2001】洛谷2530 化工厂装箱员

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

  6. shoi2001 化工厂装箱员

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

  7. 洛谷 P3195 [HNOI2008]玩具装箱 —— 斜率优化

    This way 题意: 题解: 洛谷的题解就写的蛮好,首先对于斜率优化,先将它的转移方程写出来,然后对于只包含i的设为A,只包含j的设为B,然后对于含有A和B的项就是二元一次方程中的k和x 这个就可 ...

  8. 【codevs2098】【Tyvj1625】化工厂装箱员,煞笔的人打煞笔的DP

    传送门1 传送门2 写在前面:数据结构题写多了,写dp反而不会写了 思路:刚开始以为是贪心,很快发现这是错误的233(反例很好找的),后来看到n才100,就动了一些歪脑筋打暴力,后来才发现是一个可以记 ...

  9. 洛谷 [P1314] 聪明的质检员(NOIP2011 D2T2)

    一道二分答案加前缀和 题目中已经暗示的很明显了 "尽可能靠近" " 最小值" 本题的主要坑点在于 long long 的使用 abs函数不支持long long ...

最新文章

  1. thinkphp框架使用心得
  2. github 开源项目 java_2019 年 GitHub 上最热门的 Java 开源项目
  3. 计算机专业师资描述,计算机专业师资队伍建设6主持建设优质核心课或教科研课题相关材料.doc...
  4. mysql5.1.7升级到5.6_1 MySQL5.6 升级到 5.7 版本
  5. jmeter性能测试实例_实例教程:手把手教你Jmeter性能测试
  6. Java 读取 INI 配置文件的方法
  7. “云闪付”玩转象山影视城 银联商务助力智慧景区建设
  8. Win10系统Qt安装及配置
  9. Import REC修复的时候找不到被调试程序进程
  10. 在线有道词典,又添新特色了!
  11. camera基础概念之等效焦距 视场角的计算
  12. 动态路由 华三nat 静态路由_H3C MSR系列路由器典型配置举例(V5)-6W100
  13. KEIL平台下新建华大HC32F460单片机工程笔记
  14. Captcha Cracker (java)附带replace用法
  15. IM开发快速入门(一):什么是IM系统?
  16. Keil软件仿真STM32互补输出PWM
  17. Luat模块应用手册-示例-Luat DEMO-长连接超低功耗方案
  18. 网页跳转(APP内/浏览器)
  19. C++ abort() has been called错误
  20. 基于ESP8266的智能家庭检测系统

热门文章

  1. 报错:Misplaced alignment tab character 的解决办法以及参考文献的书写方式、There were undefined citations.解决办法
  2. java8的时期和时间
  3. 11-27 概率论两种收敛方式
  4. jvm-sandbox:基础了解及demo演示
  5. Spring学习笔记(五):JDBCTemplate+事务管理
  6. 地图处理之基本使用汇总
  7. [IMWeb训练营]-团队作业
  8. 基于 Mesh 的统一路由在海外业务的实践
  9. Flink 的状态保存和恢复
  10. golang调用网易云API