简单dp。。。 dp[s][l][r] l表示左脚所在位置,r表示右脚所在位置 的 最小消耗。。
#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
#define clr(a,b) memset((a),b,sizeof(a))
const int maxn = 1510;
typedef long long lld;
const int inf = 0x3f3f3f3f;
vector<int> vv[maxn];
int dp[2][5][5];
int cost[5][5] = {
{1,2,2,2,2},
{3,1,3,4,3},
{3,3,1,3,4},
{3,4,3,1,3},
{3,3,4,3,1}};
int main()
{
int dir;
while(~scanf("%d",&dir)&&dir)
{
clr(dp,inf);
int s=0;
dp[s][dir][0]=cost[0][dir],dp[s][0][dir]=cost[0][dir];
while(1)
{
scanf("%d",&dir);
if(!dir) break;
s^=1;
clr(dp[s],inf);
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
{
dp[s][i][dir]=min(dp[s][i][dir],dp[s^1][i][j]+cost[j][dir]);
dp[s][dir][j]=min(dp[s][dir][j],dp[s^1][i][j]+cost[i][dir]);
}
}
int ans=inf;
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
ans=min(ans,dp[s][i][j]);
printf("%d\n",ans);
}
return 0;
}