USACO-Section1.1 Broken Necklace
来源:互联网 发布:网络的利大于弊 编辑:程序博客网 时间:2024/06/04 18:42
题目大意:
一串珠子有N个(3<=N<=350),有r,b,w三种颜色,假如你要在一些点打破项链,展开成一条直线,然后从一端开始收集同颜色的珠子直到你遇到一个不同的颜色珠子,在另一端做同样的事(颜色可能与在这之前收集的不同)。 确定应该在哪里打破项链来收集到最大数目的珠子。
注:w可以当r或b
样例输入:
29
wwwbbrwrbrbrrbrbrwrwwrbwrwrrb
样例输出:
11
题解:
我最先想到的是双向枚举每一个点,有点费时间复杂度O(n2);
但是要考虑白珠子为首个的情况。
动态规划 有三种方法,最好想的吧应该是每一个点双向枚举,存在两个数组 pos[] 和 rev[],最后遍历每一个点max(i和i+1)就是答案。一、因为有白珠子这种特殊的存在,只根据necklace[i-1]是无法判断necklace[i]能够与前面的珠子相连的。所以我们用字符pre 表示前一种珠子的颜色。pre初始为necklace[0]。
二、当前珠子necklace[i] 与 pre不匹配的时候,rev[i]不一定为1, 有可能necklace[i-k]~necklace[i-1]都是白珠子w, necklace[i]与这几个白珠子是可以相连的。所以我们需要一个数组w[], w[i]表示从第i个珠子开始反向连接的最多的白珠子的个数。当necklace[i] 与 pre不匹配, rev[i] = w[i-1]+1。http://m.blog.csdn.net/article/details?id=72582309学长博客。另一种是从一个点开始取直到不能取时,标记下来,继续从这个点开始取知道不能取,两个相加,为断点处的所能取到的最大值。
代码:
C++//枚举/*ID:mujinui1PROG:beadsLANG:C++*/#include<fstream>#include<cstring>using namespace std;int main(){ ifstream fin("beads.in"); ofstream fout("beads.out"); char c[720]; char flag; int num[360]; int n,k=0; memset(num,0,sizeof(num)); fin>>n; for(int i=0;i<n;i++){ fin>>c[i]; } for(int i=n;i<2*n-1;i++){ c[i]=c[i-n]; }// for(int i=290;i<320;i++)// fout<<c[i]; for(int i=0;i<n;i++){ flag=c[i]; if(flag!='w'){ for(int j=i;c[j]==flag||c[j]=='w';j++){ num[k]++; // fout<<"k= "<<k<<"num1= "<<num[k]<<endl; } } else{ int ar=0,ab=0; flag='r'; for(int j=i;c[j]==flag||c[j]=='w';j++){ ar++; } flag='b'; for(int j=i;c[j]==flag||c[j]=='w';j++){ ab++; } //fout<<"k= "<<k<<"num2= "<<num[k]<<" ar= "<<ar<<" br= "<<ab<<endl; num[k]=ar>ab?ar:ab+num[k]; } flag=c[n+i-1]; if(flag!='w'){ for(int j=n+i-1;c[j]==flag||c[j]=='w';j--){ num[k]++; // fout<<"k= "<<k<<"num3="<<num[k]<<endl; } } else{ int ar=0,ab=0; flag='r'; for(int j=n+i-1;c[j]==flag||c[j]=='w';j--){ ar++; } flag='b'; for(int j=n+i-1;c[j]==flag||c[j]=='w';j--){ ab++; } //fout<<"k= "<<k<<"num4= "<<num[k]<<" ar= "<<ar<<" br= "<<ab<<endl; num[k]=ar>ab?ar:ab+num[k]; } k++; } int max=num[0]; int x; for(int i=0;i<n;i++){ //fout<<num[i]<<" "; if(num[i]>max){ max=num[i]; x=i; } } if(max>n){ fout<<n<<endl; } else{ //fout<<x<<endl; fout<<max<<endl; } return 0;}//DP 1参考大佬//DP 2大佬的我再找一下。
- USACO--Section1.1--Broken Necklace
- USACO-Section1.1 Broken Necklace
- USACO-Section1.1 Broken Necklace
- USACO-Section1.1 Broken Necklace
- USACO-Section1.1 Broken Necklace[...]
- USACO Section1.1 Broken Necklace
- USACO-Section1.1 Broken Necklace [动态规划]
- USACO-Section1.1 Broken Necklace【记忆化搜索】
- USACO之Section1.1.4 Broken Necklace
- USCAO-Section1.1 Broken Necklace(DP版)
- usaco 1-1-4 Broken Necklace
- Broken Necklace(USACO)
- Broken Necklace(USACO官方)
- usaco--Broken Necklace
- USACO 1.1-Broken Necklace
- usaco 1.1:Broken Necklace
- [USACO] Broken Necklace
- usaco Broken Necklace字符串
- libffm的基本使用--mac为例子
- codeforce 2A
- 360春秋杯CTF比赛WRIteUP
- 机器学习-特征选择
- [李景山php] C语言实现简单五子棋
- USACO-Section1.1 Broken Necklace
- 使用LPCXpresso开发板调试外部的电路板
- 学习Linux命令(15)
- 访问控制级别
- 避免vue表达式在加载时的闪烁
- 欢迎使用CSDN-markdown编辑器
- PKUSC2017酱油记
- java 编程思想--I/O系统(二)
- 宽文之感悟 JDF2框架