第一题是 EllysSki 。

题意:给n个数,求两个方向的最长递减区间。

可以O(n)。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
int Mx(int a,int b){return a>b?a:b;} class EllysSki{
public:
int getMax(vector <int> height);
}; int EllysSki::getMax(vector <int> height)
{
int n=height.size(),ans=;
for(int i=;i<n;i++)
{
int j=i;
while(j+<n&&height[j+]<=height[j])
j++;
ans=Mx(ans,j-i+); i=j;
}
for(int i=n-;i>=;i--)
{
int j=i;
while(j&&height[j-]<=height[j])
j--;
ans=Mx(ans,i-j+); i=j;
}
return ans;
}

第二题是 EllysTeleport 。

题意:连边,找最长链。

自己写了tarjan,没调出来。其实 n2 暴力也行。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int Mx(int a,int b){return a>b?a:b;}
int Mn(int a,int b){return a<b?a:b;}
const int N=1e4+;
int n,h[N],to[N]; bool vis[N];
class EllysTeleport{
int fnd(int x)
{
int l=,r=n,ret=;
while(l<=r)
{
int mid=l+r>>;
if(h[mid]<=x)ret=mid,l=mid+;
else r=mid-;
}
return ret;
}
public:
int getMax(int N, int H1, int A, int B, int P, int Q, int M)
{
n=N; h[]=H1;
for(int i=;i<=n;i++)
h[i]=((ll)h[i-]*A+B)%M;
sort(h+,h+n+);
for(int i=;i<=n;i++)
{
int d=((ll)h[i]*P+Q)%M;
to[i]=fnd(d);
}
int ans=;
for(int i=;i<=n;i++)
{
memset(vis,,sizeof vis);
int cnt=,cr=to[i]; vis[i]=;
while(cr&&!vis[cr])
{
cnt++;vis[cr]=;cr=to[cr];
}
ans=Mx(ans,cnt);
}
return ans;
}
};

第三题是 EllysPearls 。

题意:n(<=50) 个球排成一排,每个球是 m(<=15) 种颜色之一。一次操作可以拿出序列中任意一个球,再插进序列的任意一个位置。求最少操作次数使得相同颜色的球是一个区间。

题解:https://www.topcoder.com/blog/2019-topcoder-open-algorithm-round-1b-editorials/

颜色只有 15 ,考虑状压。 1 表示该颜色之前已经确定了一个位置,即当前球必须取出、融入之前自己颜色的区间。

特殊情况就是当前球不动,就能合法;所以再记目前最后的颜色是什么(可以是空)。

还可能遇到当前球,但是把它放在后面,即尚不确定当前颜色。发现这种情况和“融入之前自己颜色的区间”都是要花费1的代价,并且不改变状压的状态。

所以 dp[ i ][ j ][ s ] 表示前 i 个、末尾颜色是 j 、已经确定位置的颜色集合是 s ,即可转移。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N=,K=,M=(<<)+;
int n,m,a[N],bin[K],dp[][K][M];
class EllysPearls{
void cz(int &x,int y){if(y<x)x=y;}
public:
int getMin(int tN, int tM, vector <int> pearls)
{
n=tN; m=tM; for(int i=;i<n;i++)a[i+]=pearls[i];
bin[]=;for(int i=;i<=m;i++)bin[i]=bin[i-]<<;
memset(dp[],0x3f,sizeof dp[]);
dp[][][]=; bool u=,v=;
for(int i=;i<=n;i++,swap(u,v))
{
memset(dp[v],0x3f,sizeof dp[v]);
for(int j=;j<=m;j++)
for(int s=;s<bin[m];s++)//[m]not[n]
{
int tp=dp[u][j][s]; if(tp>N)continue;
int d=bin[a[i]-];
cz(dp[v][j][s],tp+);
if(!j||j==a[i])
cz(dp[v][a[i]][s|d],tp);
if(!(s&d))
cz(dp[v][a[i]][s|d],tp);
}
}
int ans=N;
for(int j=;j<=m;j++)
for(int s=;s<bin[m];s++)
cz(ans,dp[u][j][s]);
return ans;
}
};

2019 TCO Round 1B——[ 状压DP ]的更多相关文章

  1. MMM 状压dp学习记

    状压dp学习记 by scmmm 开始日期 2019/7/17 前言 状压dp感觉很好理解(本质接近于爆搜但是又有广搜的感觉),综合了dp的高效性(至少比dfs,bfs优),又能解决普通dp难搞定的问 ...

  2. [多校联考2019(Round 5 T1)] [ATCoder3912]Xor Tree(状压dp)

    [多校联考2019(Round 5)] [ATCoder3912]Xor Tree(状压dp) 题面 给出一棵n个点的树,每条边有边权v,每次操作选中两个点,将这两个点之间的路径上的边权全部异或某个值 ...

  3. Codeforces Round #363 LRU(概率 状压DP)

    状压DP: 先不考虑数量k, dp[i]表示状态为i的概率,状态转移方程为dp[i | (1 << j)] += dp[i],最后考虑k, 状态表示中1的数量为k的表示可行解. #incl ...

  4. Codeforces Round #321 (Div. 2) D. Kefa and Dishes 状压dp

    题目链接: 题目 D. Kefa and Dishes time limit per test:2 seconds memory limit per test:256 megabytes 问题描述 W ...

  5. 状压dp Codeforces Beta Round #8 C

    http://codeforces.com/contest/8/problem/C 题目大意:给你一个坐标系,给你一个人的目前的坐标(该坐标也是垃圾桶的坐标),再给你n个垃圾的坐标,这个人要捡完所有的 ...

  6. Educational Codeforces Round 13 E. Another Sith Tournament 状压dp

    E. Another Sith Tournament 题目连接: http://www.codeforces.com/contest/678/problem/E Description The rul ...

  7. Codeforces Round #321 (Div. 2) D. Kefa and Dishes(状压dp)

    http://codeforces.com/contest/580/problem/D 题意: 有个人去餐厅吃饭,现在有n个菜,但是他只需要m个菜,每个菜只吃一份,每份菜都有一个欢乐值.除此之外,还有 ...

  8. Codeforces Beta Round #8 C. Looking for Order 状压dp

    题目链接: http://codeforces.com/problemset/problem/8/C C. Looking for Order time limit per test:4 second ...

  9. 【loj6177】「美团 CodeM 初赛 Round B」送外卖2 Floyd+状压dp

    题目描述 一张$n$个点$m$条边的有向图,通过每条边需要消耗时间,初始为$0$时刻,可以在某个点停留.有$q$个任务,每个任务要求在$l_i$或以后时刻到$s_i$接受任务,并在$r_i$或以前时刻 ...

随机推荐

  1. bzoj 4161 Shlw loves matrixI——常系数线性齐次递推

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4161 还是不能理解矩阵…… 关于不用矩阵理解的方法:https://blog.csdn.ne ...

  2. Agri-Net —poj1258

    Agri-Net Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 44670   Accepted: 18268 Descri ...

  3. error MSB8008: 指定的平台工具集(v110)未安装或无效

    转自VC错误:http://www.vcerror.com/?p=318 问题描述: 平台工具集(v110)是vs2012下用的,你是用vs2010打开工程,它默认是用v100, 所以这个工程可能用v ...

  4. 【玩转SpringBoot】异步任务执行与其线程池配置

    同步代码写起来简单,但就是怕遇到耗时操作,会影响效率和吞吐量. 此时异步代码才是王者,但涉及多线程和线程池,以及异步结果的获取,写起来颇为麻烦. 不过在遇到SpringBoot异步任务时,这个问题就不 ...

  5. Mutable and Immutable Variables in Python

    本文解决python中比较令人困惑的一个小问题:传递到函数中的参数若在函数中进行了重新赋值,对于函数外的原变量有何影响.看一个小栗子: def fun(a): a=2 return a=1 fun(a ...

  6. 1.Jmeter 快速入门教程(一) - 认识jmeter和google插件

    Jmeter是免费开源的性能测试工具( 同时也可以用作功能测试,http协议debug工具 ).  在如今越来越注重知识产权的今天, 公司越来越不愿意冒着巨大的风险去使用盗版的商业性能测试工具. 但如 ...

  7. MVC通过重写OnActionExecuting获取控制器,方法和域

    一,如下代码 protected override void OnActionExecuting(ActionExecutingContext filterContext) {string _cont ...

  8. SpringMVC学习(12):基于Hibernate+Spring+Spring MVC+Bootstrap的管理系统实现

    到这里已经写到第12篇了,前11篇基本上把Spring MVC主要的内容都讲了,现在就直接上一个项目吧,希望能对有需要的朋友有一些帮助. 一.首先看一下项目结构: InfrastructureProj ...

  9. android sdcard保存文件

  10. 如何去掉万恶的wps屏保

    自从换了上个UI的电脑后,就莫名其妙的多了屏保,最开始以为屏蔽掉就好了,发现他依然不屈不挠的有,然后就百度了好多,也没找到...心累 今天终于开窍了,在角落里找打了.话不多说,上图 打开首页,找到应用 ...