uva1291

时间:2023-03-09 05:39:45
uva1291

这题说的给了 一 个 图,每次 按照他给的顺序 跳格子 给了 每种 格子之间的 转换 代价 求最后 转换代价

dp[i][j] 表示 左脚在i 右脚 在j 的最小代价 然后用滚动数组 ,就可以不断说的转化,然后固定一个 另一个变换

dp[n][i]  dp[i][n]

#include <iostream>
#include <algorithm>
#include <string.h>
#include <cstdio>
using namespace std;
typedef long long ll;
const ll maxv=1e18;
ll dp[][][];
void inti(int now){
for(int i=; i<; ++i)
for(int j=; j<; ++j)
dp[now][i][j]=maxv;
}
ll cal(int a, int b)
{
if( a== || b== ) return ;
if( a == b ) return ;
int t1 = a+ ;
if( t1 > ) t1=;
if( t1 == b ) return ;
t1 = a-;
if( t1 < ) t1=;
if( t1 == b ) return ;
return ;
}
int main()
{
int n;
while(scanf("%d",&n)==&&n){
int now=;
int late=;
inti();
dp[][][n]=;
dp[][n][]=;
int per=n;
while(true){
scanf("%d",&n);
if(n==) break;
per=n;
now=-now;
late=-late;
inti(now);
for(int i=; i<; ++i)
for(int j=; j<; ++j){
if(i==j||i==n)continue;
dp[now][n][i] = min(dp[late][j][i]+cal(j,n),dp[now][n][i]);
}
for(int i=; i<; ++i)
for(int j=; j<; ++j){
if(i==j||i==n) continue;
dp[now][i][n]=min( dp[now][i][n] , dp[late][i][j]+cal(j,n) );
}
}
ll ans=maxv;
for(int i=;i< ; ++i)
ans=min(ans, min( dp[now][per][i],dp[now][i][per]));
printf("%lld\n",ans);
} return ;
}
uva1291
uva1291