HDU 4433 locker
2012-10-29 21:12
183 查看
设状态d[i][j][k]表示前i位匹配,之后两位为j、k,达到此状态的最小代价。
(1)现场写的状态转移:
(2)后来写的状态转移:
(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; }
相关文章推荐
- HDU 4433 locker(12年天津,DP)
- hdu 4433 locker (dp)
- HDU 4433 locker (线性dp)
- HDU 4433 locker(DP)(2012 Asia Tianjin Regional Contest)
- hdu 4433 locker(DP)
- HDU 4433 locker
- HDU 4433 locker(SPFA+DP)
- ACM练级日志:HDU 4433 Locker
- HDU 4433 locker 2012 Asia Tianjin Regional Contest 减少国家DP
- Hdu 4433 locker【思维+Dp】
- HDU 4433 locker(DP)( UVA 1631 - Locker)
- HDU 4433 locker(DP)
- [HDU 4433]locker[DP]
- UVA 1631 Locker(HDU 4433)(DP)
- HDU 4433 locker
- hdu 4433(uva1631) - Locker - dp
- HDU 4433 locker(12年天津,DP)
- hdu 4433 locker(DP)
- HDU 4433 locker
- hdu 4433 locker(DP,4级)