这个dp 没什么可说的,状态很容易想,
只是有两个地方容易出错,就是从当前位置进行转移,合法性的判断(特别注意 当右脚在左面,这这时候左脚是可以tap的)。
第二个,就是计算得分。千万注意啊。
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define rep(i,n) for(int (i)=0;(i)<(n);(i)++)
const int maxn = 100;
int f(int pre,int now,int from,int to){
if(!pre||now!=pre) return 1;
if(abs(from - to) == 1 || abs(from - to) == 3) return 5;
if(abs(from - to) == 2) { return 7;}
if(abs(from - to) == 0) return 3;
}
int ok(int f,int l,int r,int to){
if(f == 0){
if(l == to) return 1;
if(r == 3 || r == to) return 0;
return 1;
}
else{
if( r == to) return 1;
if(l == 1 || l == to) return 0;
return 1;
}
}
int d[maxn][4][4][3],n;
struct node{
int p,l,r,pre;
node(int x=0,int y=0,int z=0,int w=0):
p(x),l(y),r(z),pre(w){}
}pat[maxn][4][4][3];
char str[maxn];
const char* src="URDL";
int id(char c){
if(c == '.') return -1;
rep(i,4) if(src[i]==c) return i;
}
int cnt = 0;
void print_ans(int p,int l,int r,int pre){
if(p == n) return;
node& te = pat[p][l][r][pre];
if(te.pre == 0) printf(".");
else if(te.pre==1) printf("L");
else printf("R");
//if(cnt++ > n) return ;
print_ans(te.p,te.l,te.r,te.pre);
}
int main()
{
while(scanf("%s",str)!=EOF&&str[0]!='#'){
n = strlen(str);
for(int p=n;p>=0;p--)
rep(l,4) rep(r,4) rep(pre,3){
if(p == n){
d[p][l][r][pre] = 0;
continue;
}
if(l==r ||(r==3&&l==1)) continue;
int& ans = d[p][l][r][pre];
node& path = pat[p][l][r][pre];
int to = id(str[p]);
if(to == -1){
ans = d[p+1][l][r][0];
path = node(p+1,l,r,0);
rep(i,4) if(ok(0,l,r,i)){
if(d[p+1][i][r][1]+f(pre,1,l,i)<ans){
ans = d[p+1][i][r][1]+f(pre,1,l,i);
path = node(p+1,i,r,1);
}
}
rep(i,4) if(ok(1,l,r,i)){
if(d[p+1][l][i][2]+f(pre,2,r,i)<ans){
ans = d[p+1][l][i][2]+f(pre,2,r,i);
path = node(p+1,l,i,2);
}
}
}
else{
ans = -1;
if(ok(0,l,r,to)){
ans = d[p+1][to][r][1]+f(pre,1,l,to);
path = node(p+1,to,r,1);
}
if(ok(1,l,r,to)&&(ans==-1 ||ans>d[p+1][l][to][2]+f(pre,2,r,to))){
ans = d[p+1][l][to][2]+f(pre,2,r,to);
path = node(p+1,l,to,2);
}
}
}
print_ans(0,3,1,0);
printf("\n");
}
return 0;
}