uva 1025 A Spy in the Metro DAG上的动态规划(固定终点)

来源:互联网 发布:北京seo外包公司 编辑:程序博客网 时间:2024/06/14 20:24

迭代实现

#include<cstdio>

#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#define min2(a,b) a<b?a:b
using namespace std;
const int INF=99999999;
int N,T;
int g[100][100];
int v1[300][60],v2[300][60];
int dp[300][60];
void dp1(int t,int st){
if(t>T||st>N||st<1)return;
for(int tt=t;tt<=T;tt++){
    if(dp[tt][st]==-1||dp[tt][st]>dp[t][st]+tt-t){
        dp[tt][st]=dp[t][st]+tt-t;
        if(tt!=t)dp1(tt,st);
    }
    if(v1[tt][st]){
        if(dp[tt+g[st][st+1]][st+1]==-1||dp[tt+g[st][st+1]][st+1]>dp[t][st]+tt-t){
            dp[tt+g[st][st+1]][st+1]=dp[t][st]+tt-t;
            dp1(tt+g[st][st+1],st+1);
        }
    }
    if(v2[tt][st]){
        if(dp[tt+g[st][st-1]][st-1]==-1||dp[tt+g[st][st-1]][st-1]>dp[t][st]+tt-t){
            dp[tt+g[st][st-1]][st-1]=dp[t][st]+tt-t;
            dp1(tt+g[st][st-1],st-1);
        }
    }

}

}
int main(){
int cnt=1;
while(cin>>N&&N){
cin>>T;
memset(g,0,sizeof(g));
for(int i=1;i<=N-1;i++){int t;cin>>t;g[i][i+1]=t;g[i+1][i]=t;}
memset(v1,0,sizeof(v1));
int M1;
cin>>M1;
for(int i=1;i<=M1;i++){
    int d;
    cin>>d;
    for(int t=d,st=1;t<=T&&st<=N;t+=g[st][st+1],st++)v1[t][st]=1;
}
memset(v2,0,sizeof(v2));
int M2;
cin>>M2;
for(int i=1;i<=M2;i++){
    int e;
    cin>>e;
    for(int t=e,st=N;t<=T&&st>=1;t+=g[st][st-1],st--)v2[t][st]=1;
}
memset(dp,-1,sizeof(dp));
dp[0][1]=0;
dp1(0,1);
cout<<"Case Number "<<cnt++<<": ";
if(dp[T][N]!=-1)cout<<dp[T][N]<<endl;
else cout<<"impossible"<<endl;
}

return 0;}


0 0
原创粉丝点击