生活随笔
收集整理的這篇文章主要介紹了
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的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。