uva1025 dp

这题说的是给了n个车站 从1号 车站到 n号车站,有m1辆车从1 开往n 有m2 辆车从n 开往1 一个人从1 车站 到达n 车站在T 时刻 要求再 车站呆的时间尽量少

dp[i][j] 表示 在 第i 个车站 j 时刻的 状态 他会从 dp[i][j-1]+1 和j 时刻有到i的火车经过的点来, 这样我们通过计算在j时候有什么火车到达i就可以了

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
using namespace std;
int dp[55][250];
int dd[55];
int t[2][55];
int D[2][55];
void inti(int n, int t){
   for(int i=0; i<n; ++i)
     for(int j=0; j<=t; ++j)
         dp[i][j]=t+1;
}
int main()
{
     int N,T,cas=1;
     while(scanf("%d",&N)==1&&N){
           scanf("%d",&T);

           for(int i=1; i<N; ++i)
              scanf("%d",&dd[i]);
              t[0][0]=0;
           for(int i=1; i<N; ++i)
              t[0][i]=t[0][i-1]+dd[i];
           t[1][N-1]=0;
           for(int i=N-2; i>=0; --i)
               t[1][i]=t[1][i+1]+dd[i+1];
           int m1;
           scanf("%d",&m1);
           for(int i=0; i<m1; ++i){
             scanf("%d",&D[0][i]);
           }
           int m2;
           scanf("%d",&m2);
           for(int i=0; i<m2; ++i)
           scanf("%d",&D[1][i]);
           inti(N,T);
           dp[0][0]=0;
           for(int i=1; i<=T; ++i){
                if(i==15) {
                    int ddddddd=1;

                }
               for(int j=0; j<N; ++j){
                   dp[j][i]=min(dp[j][i],dp[j][i-1]+1);
                   for(int e=0; e<m1; e++)
                      if( D[0][e]+t[0][j]==i&&j!=0){
                         for(int k=0; k<j; ++k)
                             dp[j][i]=min(dp[j][i],dp[ k ][ D[0][e]+t[0][k] ]);
                      }
                   for(int e=0; e<m2; e++){
                      if(D[1][e]+t[1][j]==i&&j!=(N-1) ){
                          for(int k=N-1; k>j; --k)
                                dp[j][i]=min(dp[j][i],dp[ k ][ D[1][e] +t[1][k] ]);
                      }
                   }
               }
           }
           printf("Case Number %d: ",cas++);
         if(dp[N-1][T]>T){
              puts("impossible");
         }else{
            printf("%d\n",dp[N-1][T]);
         }
     }

    return 0;
}

时间: 2024-10-26 23:54:35

uva1025 dp的相关文章

UVa1025 (DAG上的dp)

这是紫书上的第一个dp哈. 1.状态定义:dp[i][j]---->到时刻i的时候(出发的时候时刻为0,约定时间为时刻time),从j号车站开往N号车站,在车站等待的最少的时间. 2.这个人当前的策略: α.在车站等待一个单位的时间(该站此时没有发车时应该这么做) β.坐上开往左边的火车 γ.坐上开往右边的火车 3.状态转移方程:dp[i][j] = min(dp[i+1][j]+1,dp[i+t[j]][j+1],dp[i+t[j-1]][j-1]) 我们可以做一个乘车时刻表来记录i时刻j车站

UVA1025---A Spy in the Metro(简单dp)

dp[i][j]表示时刻i,在车站j,等待的最少时间 有3种方案: 等一分钟 往左搭车 往右搭车 /************************************************************************* > File Name: uva1025.cpp > Author: ALex > Mail: [email protected] > Created Time: 2015年05月25日 星期一 19时05分09秒 ***********

HDU 5542 The Battle of Chibi dp+树状数组

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5542 题意:给你n个数,求其中上升子序列长度为m的个数 可以考虑用dp[i][j]表示以a[i]结尾的长度为j的上升子序列有多少 裸的dp是o(n2m) 所以需要优化 我们可以发现dp的第3维是找比它小的数,那么就可以用树状数组来找 这样就可以降低复杂度 #include<iostream> #include<cstdio> #include<cstring> #include

hdu 1207 汉诺塔II (DP+递推)

汉诺塔II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4529    Accepted Submission(s): 2231 Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往

POJ - 3186 Treats for the Cows (区间DP)

题目链接:http://poj.org/problem?id=3186 题意:给定一组序列,取n次,每次可以取序列最前面的数或最后面的数,第n次出来就乘n,然后求和的最大值. 题解:用dp[i][j]表示i~j区间和的最大值,然后根据这个状态可以从删前和删后转移过来,推出状态转移方程: dp[i][j]=max(dp[i+1][j]+value[i]*k,dp[i][j-1]+value[j]*k) 1 #include <iostream> 2 #include <algorithm&

51Nod 1009 数字1的个数 | 数位DP

题意: 小于等于n的所有数中1的出现次数 分析: 数位DP 预处理dp[i][j]存 从1~以j开头的i位数中有几个1,那么转移方程为: if(j == 1) dp[i][j] = dp[i-1][9]*2+pow(10,i-1);else dp[i][j] = dp[i-1][9]+dp[i][j-1]; 然后注意下对于每个询问统计的时候如果当前位为1需要额外加上他后面所有位数的个数,就是n%pow(10,i-1); 这样总复杂度log(n)*10 #include <bits/stdc++.

HDU 3555 Bomb (数位DP)

数位dp,主要用来解决统计满足某类特殊关系或有某些特点的区间内的数的个数,它是按位来进行计数统计的,可以保存子状态,速度较快.数位dp做多了后,套路基本上都差不多,关键把要保存的状态给抽象出来,保存下来. 简介: 顾名思义,所谓的数位DP就是按照数字的个,十,百,千--位数进行的DP.数位DP的题目有着非常明显的性质: 询问[l,r]的区间内,有多少的数字满足某个性质 做法根据前缀和的思想,求出[0,l-1]和[0,r]中满足性质的数的个数,然后相减即可. 算法核心: 关于数位DP,貌似写法还是

Codeforces Round #286 (Div. 1) A. Mr. Kitayuta, the Treasure Hunter DP

链接: http://codeforces.com/problemset/problem/506/A 题意: 给出30000个岛,有n个宝石分布在上面,第一步到d位置,每次走的距离与上一步的差距不大于1,问走完一路最多捡到多少块宝石. 题解: 容易想到DP,dp[i][j]表示到达 i 处,现在步长为 j 时最多收集到的财富,转移也不难,cnt[i]表示 i 处的财富. dp[i+step-1] = max(dp[i+step-1],dp[i][j]+cnt[i+step+1]) dp[i+st

bzoj1801: [Ahoi2009]chess 中国象棋 [dp]

Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧. Input 一行包含两个整数N,M,中间用空格分开. Output 输出所有的方案数,由于值比较大,输出其mod 9999973 Sample Input 1 3 Sample Output 7 HINT 除了在3个格子中都放满炮的的情况外,其它的都可以. 100%的数据中N,M不超过10050%的数据中,N,M至少有一个数不超过