zoukankan      html  css  js  c++  java
  • “科大讯飞杯”第十七届同济大学程序设计预选赛暨高校网络友谊赛 C 张老师的旅行

    题目链接

    分析

    (dp[l][r][0])为走过区间([l,r])的景点且落脚点为(l)用的最短时间,(dp[l][r][1])为走过区间([l,r])的景点且落脚点为(r)用的最短时间。

    则有转移:

    • (dp[l][r][0]=min(dp[l+1][r][0]+p[l+1]-p[l],dp[l+1][r][1]+p[r]-p[l]))
    • (dp[l][r][1]=min(dp[l][r-1][1]+p[r]-p[r-1],dp[l][r-1][0]+p[r]-p[l]))

    转移的过程中要判断一些合法情况和边界情况。

    Code

    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<iomanip>
    #include<sstream>
    #include<cstdio>
    #include<string>
    #include<vector>
    #include<bitset>
    #include<queue>
    #include<cmath>
    #include<stack>
    #include<set>
    #include<map>
    #define rep(i,x,n) for(int i=x;i<=n;i++)
    #define per(i,n,x) for(int i=n;i>=x;i--)
    #define sz(a) int(a.size())
    #define rson mid+1,r,p<<1|1
    #define pii pair<int,int>
    #define lson l,mid,p<<1
    #define ll long long
    #define pb push_back
    #define mp make_pair
    #define se second
    #define fi first
    using namespace std;
    const double eps=1e-8;
    const int mod=1e9+7;
    const int N=1e5+10;
    const int inf=1e9;
    int n,p[1010],t[1010];
    int dp[1010][1010][2];
    int dfs(int l,int r,int s){
    	if(dp[l][r][s]!=-1) return dp[l][r][s];
    	int ret;
    	int &f=dp[l][r][s];
    	if(s==0){
    		ret=dfs(l+1,r,s)+p[l+1]-p[l];
    		if(ret<=t[l]) f=f==-1?ret:min(f,ret);
    		ret=dfs(l+1,r,!s)+p[r]-p[l];
    		if(ret<=t[l]) f=f==-1?ret:min(f,ret);
    	}else{
    		ret=dfs(l,r-1,s)+p[r]-p[r-1];
    		if(ret<=t[r]) f=f==-1?ret:min(f,ret);
    		ret=dfs(l,r-1,!s)+p[r]-p[l];
    		if(ret<=t[r]) f=f==-1?ret:min(f,ret);
    	}
    	if(f==-1) f=inf;
    	return dp[l][r][s];
    }
    int main(){
    	//ios::sync_with_stdio(false);
    	//freopen("in","r",stdin);
    	cin>>n;
    	rep(i,1,n){
    		cin>>p[i];
    	}
    	memset(dp,-1,sizeof(dp));
    	rep(i,1,n){
    		cin>>t[i];
    		if(t[i]==0) dp[i][i][0]=dp[i][i][1]=0;
    		else dp[i][i][0]=dp[i][i][1]=inf;
    	}
    	int ans=inf;
    	ans=min(dfs(1,n,0),dfs(1,n,1));
    	if(ans==inf) ans=-1;
    	cout<<ans<<endl;
    	return 0;
    }
    
  • 相关阅读:
    丸内の霊 補充4
    丸内の霊 補充3
    丸内の霊 補充2
    N1 语法单词
    完全掌握1级日本与能力考试语法问题对策
    丸の内の霊 補充1
    丸内の霊 8
    丸内の霊   7
    丸内の霊  6
    丸の内の霊 6
  • 原文地址:https://www.cnblogs.com/xyq0220/p/12885351.html
Copyright © 2011-2022 走看看