生活随笔
收集整理的这篇文章主要介绍了
2019 秦皇岛 I - Invoker Gym - 102361I dp
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
传送门
文章目录
题意:
累了,略。
思路:
将这101010个串打乱顺序,每个串最多有666种情况,全部写出来,让后连边。最后直接在转移的时候分别从上一个字符的666个状态转移就好啦。
注意连边的时候EEQEEQEEQ和EQQEQQEQQ重叠部分是222,也就是花费是111。因为这个wa了一天。
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std
;
void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL
;
typedef unsigned long long ULL
;
typedef pair
<int,int> PII
;const int N
=100010,mod
=1e9+7,INF
=0x3f3f3f3f;
const double eps
=1e-6;int n
;
char ss
[N
];
int id
[1000],now
[1000];
int g
[100][100];
string s
[100],a
[100];
int dp
[N
][50];int get(string a
,string b
)
{for(int i
=0;i
<3;i
++) if(a
.substr(i
)==b
.substr(0,3-i
)) return i
;return 3;
}int main()
{
id
['Y']=1; id
['V']=7; id
['G']=13; id
['C']=19;id
['X']=25; id
['Z']=31; id
['T']=37; id
['F']=43;id
['D']=49; id
['B']=55;a
[1]="QQQ"; a
[2]="QQQ"; a
[3]="QQQ"; a
[4]="QQQ"; a
[5]="QQQ"; a
[6]="QQQ"; a
[7]="QQW"; a
[8]="QWQ"; a
[9]="WQQ"; a
[10]="WQQ"; a
[11]="WQQ"; a
[12]="WQQ"; a
[13]="EQQ"; a
[14]="QEQ"; a
[15]="QQE"; a
[16]="QQE"; a
[17]="QQE"; a
[18]="QQE"; a
[19]="WWW"; a
[20]="WWW"; a
[21]="WWW"; a
[22]="WWW"; a
[23]="WWW"; a
[24]="WWW"; a
[25]="QWW"; a
[26]="WQW"; a
[27]="WWQ"; a
[28]="WWQ"; a
[29]="WWQ"; a
[30]="WWQ"; a
[31]="EWW"; a
[32]="WEW"; a
[33]="WWE"; a
[34]="WWE"; a
[35]="WWE"; a
[36]="WWE"; a
[37]="EEE"; a
[38]="EEE"; a
[39]="EEE"; a
[40]="EEE"; a
[41]="EEE"; a
[42]="EEE"; a
[43]="EEQ"; a
[44]="EQE"; a
[45]="QEE"; a
[46]="QEE"; a
[47]="QEE"; a
[48]="QEE"; a
[49]="EEW"; a
[50]="EWE"; a
[51]="WEE"; a
[52]="WEE"; a
[53]="WEE"; a
[54]="WEE"; a
[55]="EQW"; a
[56]="EWQ"; a
[57]="QEW"; a
[58]="QWE"; a
[59]="WEQ"; a
[60]="WQE"; for(int i
=1;i
<=60;i
++) for(int j
=1;j
<=60;j
++) if(i
!=j
) g
[i
][j
]=get(a
[i
],a
[j
]);while(scanf("%s",ss
+1)!=EOF){n
=strlen(ss
+1); int ans
=INF
;ans
=n
*3; for(int i
=1;i
<=n
;i
++) for(int j
=0;j
<6;j
++) dp
[i
][j
]=i
*3;for(int i
=1;i
<=60;i
++) g
[i
][i
]=0;for(int aa
=0;aa
<6;aa
++) dp
[1][aa
]=3;for(int i
=2;i
<=n
;i
++){for(int aa
=0;aa
<6;aa
++)for(int b
=0;b
<6;b
++){dp
[i
][aa
]=min(dp
[i
][aa
],dp
[i
-1][b
]+g
[id
[ss
[i
-1]]+b
][id
[ss
[i
]]+aa
]);}}for(int aa
=0;aa
<6;aa
++) ans
=min(ans
,dp
[n
][aa
]);cout
<<(ans
+n
)<<endl
;}return 0;
}
创作挑战赛新人创作奖励来咯,坚持创作打卡瓜分现金大奖
总结
以上是生活随笔为你收集整理的2019 秦皇岛 I - Invoker Gym - 102361I dp的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。