原题
只是一个多段图的最短路dp,我却实现了好久,真失败。
失败总结:
1. 逻辑不清晰,不同技能之间的转移代价一定不为0,于是我想当然的认为相同技能之间的转移代价为0(相同技能在不同顺序下转移不为0)
2. 细节太差,想明白问题后,细节部分有错, u看成v,再次拖延了AC时间
代码
#include <bits/stdc++.h>
using namespace std;
// YVGCXZTFDBYVGCXZTFDBYVGCXZTFDBYVGCXZTFDBYVGCXZTFDBYVGCXZTFDBYVGCXZTFDBYVGCXZTFDBYVGCXZTFDBYVGCXZTFDBYVGCXZTFDBYVGCXZTFDBYVGCXZTFDB
vector<string> g[12];
/*
QQQ Y
0 QQQ
QQW V
1 WQQ QWQ QQW
QQE G
2 EQQ QEQ QQE
WWW C
3 WWW
QWW X
4 QWW WQW WWQ
WWE Z
5 EWW WEW WWE
EEE T
6 EEE
QEE F
7 QEE EQE EEQ
WEE D
8 WEE EWE EEW
QWE B
9 QWE QEW WQE WEQ EQW EWQ
*/
const int inf = 1e9;
const int maxn = 1e6 + 100;
char cc[128];
int d[11][7][11][7];
int dp[maxn][7];
int last[maxn][7][2];
void dists(int m, int n)
{
for (int i = 0; i < g[m].size(); ++i)
{
for (int j = 0; j < g[n].size(); ++j)
{
string u = g[m][i];
string v = g[n][j];
int dist;
if (u[0] == v[0] && u[1] == v[1] && u[2] == v[2])
dist = 0;
else if (u[1] == v[0] && u[2] == v[1])
dist = 1;
else if (u[2] == v[0])
dist = 2;
else
dist = 3;
d[m][i][n][j] = dist;
}
}
}
string s;
void dfs(int i, int j)
{
int ii = last[i][j][0], jj = last[i][j][1];
if (i) dfs(ii, jj);
cout << g[cc[s[i]]][j] << " " << d[cc[s[ii]]][jj][cc[s[i]]][j] << endl;
}
int main()
{
g[0].push_back("QQQ");
g[1].push_back("WQQ");
g[1].push_back("QWQ");
g[1].push_back("QQW");
g[2].push_back("EQQ");
g[2].push_back("QEQ");
g[2].push_back("QQE");
g[3].push_back("WWW");
g[4].push_back("QWW");
g[4].push_back("WQW");
g[4].push_back("WWQ");
g[5].push_back("EWW");
g[5].push_back("WEW");
g[5].push_back("WWE");
g[6].push_back("EEE");
g[7].push_back("QEE");
g[7].push_back("EQE");
g[7].push_back("EEQ");
g[8].push_back("WEE");
g[8].push_back("EWE");
g[8].push_back("EEW");
g[9].push_back("QWE");
g[9].push_back("QEW");
g[9].push_back("WQE");
g[9].push_back("WEQ");
g[9].push_back("EQW");
g[9].push_back("EWQ");
for (int i = 0; i < 10; ++i)
for (int j = 0; j < 10; ++j)
dists(i, j);
cc['Y'] = 0;
cc['V'] = 1;
cc['G'] = 2;
cc['C'] = 3;
cc['X'] = 4;
cc['Z'] = 5;
cc['T'] = 6;
cc['F'] = 7;
cc['D'] = 8;
cc['B'] = 9;
while (cin >> s)
{
int len = s.length();
for (int i = 0; i < len; ++i)
for (int j = 0; j < 6; ++j)
dp[i][j] = inf;
for (int i = 0; i < g[cc[s[0]]].size(); ++i)
dp[0][i] = 3;
for (int i = 1; i < len; ++i)
{
int ns = cc[s[i]];
int nsize = g[ns].size();
for (int j = 0; j < nsize; ++j)
{
int ls = cc[s[i - 1]];
int lsize = g[ls].size();
for (int k = 0; k < lsize; ++k)
{
if (dp[i][j] > dp[i - 1][k] + d[ls][k][ns][j])
{
dp[i][j] = dp[i - 1][k] + d[ls][k][ns][j];
last[i][j][0] = i - 1;
last[i][j][1] = k;
}
}
}
}
int ans = inf, loc;
for (int i = 0; i < g[cc[s[len - 1]]].size(); ++i)
{
if (ans > dp[len - 1][i])
{
ans = dp[len - 1][i];
loc = i;
}
}
cout << ans + len << endl;
//dfs(len - 1, loc);
} // 3 0 4 2
// CXXDTCBBZG
return 0;// XDTBV
}