题意:http://acm.hdu.edu.cn/showproblem.php?pid=6739

尽量让他们连起来。

思路:

直接dp,其中一个状态是以什么结尾。

 #define IOS ios_base::sync_with_stdio(0); cin.tie(0);
#include <cstdio>//sprintf islower isupper
#include <cstdlib>//malloc exit strcat itoa system("cls")
#include <iostream>//pair
#include <fstream>//freopen("C:\\Users\\13606\\Desktop\\草稿.txt","r",stdin);
#include <bitset>
//#include <map>
//#include<unordered_map>
#include <vector>
#include <stack>
#include <set>
#include <string.h>//strstr substr
#include <string>
#include <time.h>//srand(((unsigned)time(NULL))); Seed n=rand()%10 - 0~9;
#include <cmath>
#include <deque>
#include <queue>//priority_queue<int, vector<int>, greater<int> > q;//less
#include <vector>//emplace_back
//#include <math.h>
//#include <windows.h>//reverse(a,a+len);// ~ ! ~ ! floor
#include <algorithm>//sort + unique : sz=unique(b+1,b+n+1)-(b+1);+nth_element(first, nth, last, compare)
using namespace std;//next_permutation(a+1,a+1+n);//prev_permutation
//******************
int abss(int a);
int lowbit(int n);
int Del_bit_1(int n);
int maxx(int a,int b);
int minn(int a,int b);
double fabss(double a);
void swapp(int &a,int &b);
clock_t __STRAT,__END;
double __TOTALTIME;
void _MS(){__STRAT=clock();}
void _ME(){__END=clock();__TOTALTIME=(double)(__END-__STRAT)/CLOCKS_PER_SEC;cout<<"Time: "<<__TOTALTIME<<" s"<<endl;}
//***********************
#define rint register int
#define fo(a,b,c) for(rint a=b;a<=c;++a)
#define fr(a,b,c) for(rint a=b;a>=c;--a)
#define mem(a,b) memset(a,b,sizeof(a))
#define pr printf
#define sc scanf
#define ls rt<<1
#define rs rt<<1|1
typedef long long ll;
const double E=2.718281828;
const double PI=acos(-1.0);
//const ll INF=(1LL<<60);
const int inf=(<<);
const double ESP=1e-;
const int mod=(int)1e9+;
const int N=(int)1e5+; int dp[N][];
char s[N];
int tot;
int ID[];
int map[];
int id(int x)
{
return ID[x];
}
struct node
{
int a,b,c;
}p[];
void PR(int _[],int n)
{
for(int i=;i<=n;++i)
pr("%d ",_[i]);
pr("\n");
}
int main()
{
tot=;
for(int i=;i<=;++i)
{
int temp=i;
bool f=;
while(temp>)
{
if(temp%!=&&temp%!=&&temp%!=)
f=;
temp/=;
}
if(f)map[++tot]=i;
}
for(int i=;i<=;++i)
ID[map[i]]=i;
p[]={,,};
p[]={,,};
p[]={,,};
p[]={,,};
p[]={,,};
p[]={,,};
int v[];
v['Y']=;
v['V']=;
v['G']=;
v['C']=;
v['X']=;
v['Z']=;
v['T']=;
v['F']=;
v['D']=;
v['B']=;
while(~sc("%s",s+))
{
int l=strlen(s+);
for(int i=;i<=l;++i)
for(int j=;j<=;++j)
dp[i][j]=inf;
for(int i=;i<=;++i)
{
int temp=v[s[]];
int cnt=;
int mp[];
while(temp>)
{
mp[cnt]=temp%;
temp/=;
cnt--;
}
int x=mp[p[i].b]*+mp[p[i].c];
dp[][id(mp[p[i].a]*+mp[p[i].b]*+mp[p[i].c])]=min(,dp[][id(mp[p[i].a]*+mp[p[i].b]*+mp[p[i].c])]);
dp[][id(x)]=min(dp[][id(x)],);
x=mp[p[i].c];
dp[][id(x)]=min(dp[][id(x)],);
}
//PR(dp[1],37);
int ans=;
for(int i=;i<=l+;++i)
{
int min_=inf;
for(int j=;j<=;++j)
min_=min(min_,dp[i-][j]);
ans=min_;
if(i==l+)break; int temp=v[s[i]];
int cnt=;
int mp[];
while(temp>)
{
mp[cnt]=temp%;
temp/=;
cnt--;
}
for(int j=;j<=;++j)
{
int x=mp[p[j].a],y=mp[p[j].b],z=mp[p[j].c];
// cout<<x<<' '<<y<<' '<<z<<endl;
dp[i][id(x*+y*+z)]=min(dp[i][id(x*+y*+z)],min(min(dp[i-][id(x)]+,min(min_+,dp[i-][id(x*+y)]+)),dp[i-][id(x*+y*+z)]));
dp[i][id(y*+z)]=min(dp[i][id(y*+z)],min(min(dp[i-][id(x)]+,min(min_+,dp[i-][id(x*+y)]+)),dp[i-][id(x*+y*+z)]));
dp[i][id(z)]=min(dp[i][id(z)],min(min(dp[i-][id(x)]+,min(min_+,dp[i-][id(x*+y)]+)),dp[i-][id(x*+y*+z)]));
}
// PR(dp[i],37);
}
pr("%d\n",ans+l);
}
return ;
} /**************************************************************************************/ int maxx(int a,int b)
{
return a>b?a:b;
} void swapp(int &a,int &b)
{
a^=b^=a^=b;
} int lowbit(int n)
{
return n&(-n);
} int Del_bit_1(int n)
{
return n&(n-);
} int abss(int a)
{
return a>?a:-a;
} double fabss(double a)
{
return a>?a:-a;
} int minn(int a,int b)
{
return a<b?a:b;
}

Invoker(小DP)的更多相关文章

  1. HDU6739 Invoker 【dp】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6739 借鉴了这个网址的题解:https://blog.csdn.net/qq_41785863/art ...

  2. K 破忒头的匿名信(ac自动机+小dp)

    题:https://ac.nowcoder.com/acm/contest/4010/K 题意:用一些模式串凑成一个目标串,每个模式串有消耗,问组合的最小消耗,或不能组成输出-1: 分析:典型的AC自 ...

  3. 1003: [ZJOI2006]物流运输 = DP+SBFA

    题意就是告诉你有n个点,e条边,m天,每天都会从起点到终点走一次最短路,但是有些点在某些时间段是不可走的,因此在某些天需要改变路径,每次改变路径的成本是K,总成本=n天运输路线长度之和+K*改变运输路 ...

  4. POJ 1252 Euro Efficiency(完全背包, 找零问题, 二次DP)

    Description On January 1st 2002, The Netherlands, and several other European countries abandoned the ...

  5. 三:背包DP

    01背包问题描述 已知:有一个容量为V的背包和N件物品,第i件物品的重量是weight[i],收益是cost[i]. 限制:每种物品只有一件,可以选择放或者不放 问题:在不超过背包容量的情况下,最多能 ...

  6. bzoj 2017: [Usaco2009 Nov]硬币游戏【dp】

    废了废了,一个小dp都想不出来 把c数组倒序一下,变成1在最下,设f[i][j]为某一人取完j个之后还剩1~i的硬币,转移的话应该是f[i][j]=max(s[i]-f[i-k][k]),就是1~n的 ...

  7. POJ 3280 Cheapest Palindrome ( 区间DP && 经典模型 )

    题意 : 给出一个由 n 中字母组成的长度为 m 的串,给出 n 种字母添加和删除花费的代价,求让给出的串变成回文串的代价. 分析 :  原始模型 ==> 题意和本题差不多,有添和删但是并无代价 ...

  8. SP8222 NSUBSTR - Substrings(后缀自动机+dp)

    传送门 解题思路 首先建出\(sam\),然后把\(siz\)集合通过拓扑排序算出来.对于每个点只更新它的\(maxlen\),然后再从大到小\(dp\)一次就行了.因为\(f[maxlen-1]&g ...

  9. USACO 2007 February Silver The Cow Lexicon /// DP oj24258

    题目大意: 输入w,l: w是接下来的字典内的单词个数,l为目标字符串长度 输入目标字符串 接下来w行,输入字典内的各个单词 输出目标字符串最少删除多少个字母就能变成只由字典内的单词组成的字符串 Sa ...

随机推荐

  1. topcoder13444

    CountTables TopCoder - 13444 sol:题意和题解都丢在上面了,自己XJByy了一下 先保证行不同,然后对列容斥,dp[i]表示i列的答案 行不同时i列的答案显然是C(c^i ...

  2. CF1204A

    CF1204A. BowWow and the Timetable 题意: 给你一个2进制数,求这个2进制数在10进制中的 $ 4^i $ 的个数. 解法: 其实就是 $ \ulcorner_{\lo ...

  3. Linux设备驱动程序 之 ioctl

    ioctl 除了读取和写入设备之外,大部分驱动程序还需要另外一种能力,即通过设备驱动程序执行各种类型的硬件控制,通常这种需求使用ioctl方法支持,该方法实现了同名的系统调用: 在用户空间,ioctl ...

  4. <javaScript>谈谈JavaScript中的变量、指针和引用

    1.变量我们可能产生这样一个疑问:编程语言中的变量到底是什么意思呢?事实上,当我们定义了一个变量a时,就是在存储器中指定了一组存储单元,并将这组存储单元命名为a.变量a的值实际上描述的是这组存储单元中 ...

  5. LC 640. Solve the Equation

    Solve a given equation and return the value of x in the form of string "x=#value". The equ ...

  6. Camera 录制视频的实现

    使用 Camera 录制视频, 实现步骤如下: 需要权限: android.permission.CAMERA android.permission.RECORD_AUDIO android.perm ...

  7. ssm整合用到的依赖jar包(不充足)

    <!--spring 的核心的jar包--><dependency> <groupId>org.springframework</groupId> &l ...

  8. 改进后的socket轮子,欢迎挑战

    运行环境.net core2.1 下载地址

  9. Linux命令集锦:crontab命令

    Linux crontab是用来定期执行程序的命令.当安装完成操作系统之后,默认便会启动此任务调度命令.crontab命令每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作. 而 ...

  10. 配置yum镜像源

    centos7配置本地yum源 先从官网下载centos7镜像 以centos7.4 为例 CentOS-7-x86_64-Everything-1804 [root@kangvcar ~]# mv ...