这个题和乌龟棋之类的DP差不多要学会缩减状态

就是,,我们只需枚举当前这个人是谁,选什么颜色,A用了多少,B用了多少

C用了多少我们就不用枚举了,知道选了多少人,A,B用了多少,你还不知C用了多少么,因为总共只有这三种颜色

然后结尾不能与开头相同。。我郁闷了好久。。因为并不能直接知道开头是什么状态。。

那么一种想法就是枚举开头的三种情况(如果有的话),做三次DP,直接调用全局变量就能知道开始时是什么颜色

我写了个记忆化搜索,TLE了,改成DP应该能过

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char s[100];
int col[4],cf;//first color
int dp[55][3][55][55];
int dfs(int x,int cx,int c0,int c1){
// printf("pos:%d col:%d c0:%d c1:%d\n",x,cx,c0,c1);
if(dp[x][cx][c0][c1]!=-1) return dp[x][cx][c0][c1];
if(x==col[3]){
//这里用枚举
if(cx!=cf) return dp[x][cx][c0][c1]=1;
return dp[x][cx][c0][c1]=0;
}
int ans=0;
for(int i=0;i<3;++i){
if(i!=cx) {
if(i==0&&col[0]-c0<=0) continue;
if(i==1&&col[1]-c1<=0) continue;
// if(i==2&&col[2]+c0+c1>=col[3]) continue;
if(i==2&&col[2]-(x-c0-c1)<=0) continue;
if(i==0){
ans+=dfs(x+1,i,c0+1,c1);
}
else if(i==1){
ans+=dfs(x+1,i,c0,c1+1);
}
else{
ans+=dfs(x+1,i,c0,c1);
}
}
}
return ans;
}
void solve(){
int i,j,k,p; for(i=col[3];i>=1;--i){
for(j=0;j<3;++j){
for(k=0;k<)
}
}
}
int main(){
//3^12 约等于 50000+
int T;scanf("%d",&T);
while(T--){
scanf("%s",s);
int len=strlen(s),i;
memset(col,0,sizeof(col));
memset(dp,-1,sizeof(dp));
for(i=0;i<len;++i){
col[s[i]-'A']++;
}
col[3]=len;
int res=0;
for(i=0;i<3;++i){
cf=i;
if(col[i]>0) }
printf("%d\n",res);
}
return 0;
}

sdut2879 枚举起点DP的更多相关文章

  1. AtCoder Regular Contest 069 D - Menagerie 枚举起点 模拟递推

    arc069.contest.atcoder.jp/tasks/arc069_b 题意:一堆不明身份的动物排成一圈,身份可能是羊或狼,羊一定说实话,狼一定说假话.大家各自报自己的两边是同类还是不同类, ...

  2. HDU 5965 枚举模拟 + dp(?)

    ccpc合肥站的重现...一看就觉得是dp 然后强行搞出来一个转移方程 即 根据第i-1列的需求和i-1 i-2列的枚举摆放 可以得出i列摆放的种类..加了n多if语句...最后感觉怎么都能过了..然 ...

  3. 2017广东工业大学程序设计竞赛初赛 题解&源码(A,水 B,数学 C,二分 D,枚举 E,dp F,思维题 G,字符串处理 H,枚举)

    Problem A: An easy problem Description Peter Manson owned a small house in an obscure street. It was ...

  4. BZOJ 1799 - [AHOI2009]self 同类分布 - 枚举 数位DP

    Description 找出$[L, R]$ 区间内有多少数, 各位数字和 能整除原数 Solution 枚举每个可能的数字和, 进行数位DP即可 , 水爆 Code #include<cstd ...

  5. (容量超大)or(容量及价值)超大背包问题 ( 折半枚举 || 改变 dp 意义 )

    题意 : 以下两个问题的物品都只能取有且只有一次 ① 给你 N 个物品,所有物品的价值总和不会超过 5000, 单个物品的价格就可达 10^10 ,背包容量为 B ② 给你 N (N ≤ 40 ) 个 ...

  6. CF1277A. Happy Birthday, Polycarp! 题解 枚举/数位DP

    题目链接:http://codeforces.com/contest/1277/problem/A 题目大意: 求区间 \([1,n]\) 范围内有多少只包含一个数字的数. 比如:\(1,77,777 ...

  7. Codeforces 834E The Bakery【枚举+数位dp】

    E. Ever-Hungry Krakozyabra time limit per test:1 second memory limit per test:256 megabytes input:st ...

  8. CF1556F Sports Betting (状压枚举子集DP)

    F 对于一张比赛图,经过缩点,会得到dag,且它一定是transitive的,因此我们能直接把比赛图缩成一个有向链.链头作为一个强连通分量,里面的所有点都是胜利的 定义F(win)表示win集合作为赢 ...

  9. 区间dp专题

    HDU4283You Are the One区间dp, 记忆话搜索运行时间:   #include <iostream> #include <cstdio> #include ...

随机推荐

  1. Python爬虫:数据分析小能手:JSON库的用法

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写. 给大家推荐一个Python交流的q裙,大家在学习遇到了什么问题都可以进群一起交流,大家 ...

  2. XV6学习(2)Lab syscall

    实验的代码放在了Github上. 第二个实验是Lab: system calls. 这个实验主要就是自己实现几个简单的系统调用并添加到XV6中. XV6系统调用 添加系统调用主要有以下几步: 在use ...

  3. Linux 通过端口终止进程

    以下命令可用于杀死占用某端口的所有进程. root 用户: kill -9 $(lsof -i tcp:进程号 -t) 非 root 用户: kill -9 $(sudo lsof -i tcp:进程 ...

  4. Wireshark抓包参数

    目录 wireshark 抓包过滤器 一.抓包过滤器 二.显示过滤器 整理自陈鑫杰老师的wireshark教程课 wireshark 抓包过滤器 过滤器分为抓包过滤器和显示过滤器,抓包过滤器会将不满足 ...

  5. NodeJS入门学习教程

    一.概念 1.什么是nodejs Node.js是JavaScript 运行时环境,通俗易懂的讲,Node.js是JavaScript的运行平台 Node.js既不是语言,也不是框架,它是一个平台 2 ...

  6. loj10018数的划分

    题目描述 将整数 n 分成 k 份,且每份不能为空,问有多少种不同的分法.当 n=7,k=3 时,下面三种分法被认为是相同的:1 1 5;1 5 1 ;5 1 1 输入格式 一行两个数 n ,k . ...

  7. Java——继承,重载,重写三剑客

    About-继承 所有Java的类均是由java.lang.Object类继承而来的,所以Object是所有类的祖先类,而除了Object外,所有类必须有一个父类. 继承可以理解为一个对象从另一个对象 ...

  8. Linux 调整系统时间偏差

    在使用Linux系统部署项目,有时会出现时间跟当前时间不一致的情况,这个时候需要做些调整: 1.首先删除之前设置的时区 rm -rf /etc/localtime 2.创建上海时区 ln -s /us ...

  9. Kubernetes --(k8s)入门

    k8s 简介: 什么是k8s? Kubernetes (k8s)是Google开源的容器集群管理系统(谷歌内部:Borg).在Docker技术基础上,为容器化的应用提供部署运行.资源调度.服务发现和动 ...

  10. SSL与HTTPS协议

    1.SSL 1.1 什么是SSL SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及 ...