您的位置:首页 > 其它

HDU 4433 locker

2012-10-29 21:12 183 查看
设状态d[i][j][k]表示前i位匹配,之后两位为j、k,达到此状态的最小代价。

(1)现场写的状态转移:

//2012-10-29 21:07:26	Accepted	4433	687MS	4552K	3686 B	G++	Aros
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define MAX 10
#define up(x) (x+1)%MAX
#define down(x) (x+9)%MAX
#define id(x) x-'0'
using namespace std;
const int MAXN = 1000+5;
const int INF = 0x3f3f3f3f;
int g[MAX][MAX][MAX][MAX][MAX][MAX], f[MAXN][MAX][MAX];
char cur[MAXN], pas[MAXN];
bool vis[MAX][MAX][MAX];
struct Node
{
int p[3];
Node(){}
Node(int x, int y, int z)
{
p[0] = x; p[1] = y; p[2] = z;
}
};
int main()
{
queue<pair<Node, int> > Q;
for (int i = 0; i < MAX; i++)
for (int j = 0; j < MAX; j++)
for (int k = 0; k < MAX; k++)
{
memset(vis, 0, sizeof(vis));
Q.push(make_pair(Node(i, j, k), 0));
vis[i][j][k] = 1;
while (!Q.empty())
{
Node u = Q.front().first;
int step = Q.front().second;
Q.pop();
g[i][j][k][u.p[0]][u.p[1]][u.p[2]] = step;
if (!vis[up(u.p[0])][u.p[1]][u.p[2]])
{
Q.push(make_pair(Node(up(u.p[0]), u.p[1], u.p[2]), step+1));
vis[up(u.p[0])][u.p[1]][u.p[2]] = 1;
}
if (!vis[u.p[0]][up(u.p[1])][u.p[2]])
{
Q.push(make_pair(Node(u.p[0], up(u.p[1]), u.p[2]), step+1));
vis[u.p[0]][up(u.p[1])][u.p[2]] = 1;
}
if (!vis[u.p[0]][u.p[1]][up(u.p[2])])
{
Q.push(make_pair(Node(u.p[0], u.p[1], up(u.p[2])), step+1));
vis[u.p[0]][u.p[1]][up(u.p[2])] = 1;
}
if (!vis[up(u.p[0])][up(u.p[1])][u.p[2]])
{
Q.push(make_pair(Node(up(u.p[0]), up(u.p[1]), u.p[2]), step+1));
vis[up(u.p[0])][up(u.p[1])][u.p[2]] = 1;
}
if (!vis[u.p[0]][up(u.p[1])][up(u.p[2])])
{
Q.push(make_pair(Node(u.p[0], up(u.p[1]), up(u.p[2])), step+1));
vis[u.p[0]][up(u.p[1])][up(u.p[2])] = 1;
}
if (!vis[up(u.p[0])][up(u.p[1])][up(u.p[2])])
{
Q.push(make_pair(Node(up(u.p[0]), up(u.p[1]), up(u.p[2])), step+1));
vis[up(u.p[0])][up(u.p[1])][up(u.p[2])] = 1;
}
if (!vis[down(u.p[0])][u.p[1]][u.p[2]])
{
Q.push(make_pair(Node(down(u.p[0]), u.p[1], u.p[2]), step+1));
vis[down(u.p[0])][u.p[1]][u.p[2]] = 1;
}
if (!vis[u.p[0]][down(u.p[1])][u.p[2]])
{
Q.push(make_pair(Node(u.p[0], down(u.p[1]), u.p[2]), step+1));
vis[u.p[0]][down(u.p[1])][u.p[2]] = 1;
}
if (!vis[u.p[0]][u.p[1]][down(u.p[2])])
{
Q.push(make_pair(Node(u.p[0], u.p[1], down(u.p[2])), step+1));
vis[u.p[0]][u.p[1]][down(u.p[2])] = 1;
}
if (!vis[down(u.p[0])][down(u.p[1])][u.p[2]])
{
Q.push(make_pair(Node(down(u.p[0]), down(u.p[1]), u.p[2]), step+1));
vis[down(u.p[0])][down(u.p[1])][u.p[2]] = 1;
}
if (!vis[u.p[0]][down(u.p[1])][down(u.p[2])])
{
Q.push(make_pair(Node(u.p[0], down(u.p[1]), down(u.p[2])), step+1));
vis[u.p[0]][down(u.p[1])][down(u.p[2])] = 1;
}
if (!vis[down(u.p[0])][down(u.p[1])][down(u.p[2])])
{
Q.push(make_pair(Node(down(u.p[0]), down(u.p[1]), down(u.p[2])), step+1));
vis[down(u.p[0])][down(u.p[1])][down(u.p[2])] = 1;
}
}
}
while (scanf("%s%s", cur+1, pas+1) != EOF)
{
int n = strlen(pas+1);
strcpy(cur+n+1, "00");
for (int i = 0; i < MAX; i++)
for (int j = 0; j < MAX; j++)
f[0][i][j] = g[0][id(cur[1])][id(cur[2])][0][i][j];
for (int i = 1; i <= n; i++)
for (int a = 0; a < MAX; a++)
for (int b = 0; b < MAX; b++)
{
f[i][a][b] = INF;
for (int c = 0; c < MAX; c++)
for (int d = 0; d < MAX; d++)
f[i][a][b] = min(f[i][a][b], f[i-1][c][d]+g[c][d][id(cur[i+2])][id(pas[i])][a][b]);
}
printf("%d\n", f
[0][0]);
}
return 0;
}


(2)后来写的状态转移:

//2012-10-29 21:07:58	Accepted	4433	375MS	596K	1465 B	G++	Aros
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = 1004+5;
const int MAX = 10;
const int INF = 0x3f3f3f3f;
int d[MAXN][MAX][MAX];
char cur[MAXN], pas[MAXN];
inline int id(char x)
{
return x-'0';
}
inline int up(int x, int y)
{
return (x+y)%MAX;
}
inline int down(int x, int y)
{
return (x-y+MAX)%MAX;
}
int main()
{
while (scanf("%s%s", cur+1, pas+1) != EOF)
{
int n = strlen(pas+1);
strcpy(cur+1+n, "00");
for (int i = 0; i <= n; i++)
memset(d[i], 0x3f, sizeof(d[i]));
for (int i = 0; i < MAX/2; i++)
for (int j = 0; j <= i; j++)
{
d[0][up(id(cur[1]), i)][up(id(cur[2]), j)] = min(d[0][up(id(cur[1]), i)][up(id(cur[2]), j)], i);
d[0][down(id(cur[1]), i)][down(id(cur[2]), j)] = min(d[0][down(id(cur[1]), i)][down(id(cur[2]), j)], i);
}
for (int i = 0; i < n; i++)
for (int j = 0; j < MAX; j++)
for (int k = 0; k < MAX; k++) if (d[i][j][k] < INF)
{
int p = (id(pas[i+1])-j+MAX)%MAX, q = (j-id(pas[i+1])+MAX)%MAX;
for (int a = 0; a <= p; a++)
for (int b = 0; b <= a; b++)
d[i+1][up(k, a)][up(id(cur[i+3]), b)] = min(d[i+1][up(k, a)][up(id(cur[i+3]), b)], d[i][j][k]+p);
for (int a = 0; a <= q; a++)
for (int b = 0; b <= a; b++)
d[i+1][down(k, a)][down(id(cur[i+3]), b)] = min(d[i+1][down(k, a)][down(id(cur[i+3]), b)], d[i][j][k]+q);
}
printf("%d\n", d
[0][0]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: