HDU 4433 locker

        设状态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[n][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[n][0][0]);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值