zoj3541(区间dp+贪心)

来源:互联网 发布:济南编程培训 编辑:程序博客网 时间:2024/06/04 00:49

链接:点击打开链接

题意:给出一排按钮,要求把所有按钮全部按下,每移动一单位距离需要一单位时间,给出每个按钮的位置,并且每个按钮按下后经过一定的时间又会弹起来,把所有按钮按下的步骤

代码:

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;const int INF=0x3f3f3f3f;int t[205],d[205];int dp[205][205][2],path[205][205][2];int main(){                                     //dp[i][j][0]代表按完[i,j]区间的按钮并停留在左端点    int n,i,j,l,r,le,re,tmp;                    //dp[i][j][1]代表按完[i,j]区间的按钮并停留在右端点    while(scanf("%d",&n)!=EOF){                 //当要按完一个区间内所有按钮时,如果按中间任意一个则按左右        for(i=1;i<=n;i++)                       //两个端点的按钮时一定会出现走重复的路,因此每一次一定从左右        scanf("%d",&t[i]);                      //端点开始按        for(i=1;i<=n;i++)        scanf("%d",&d[i]);        memset(dp,0,sizeof(dp));        for(l=2;l<=n;l++){            for(i=1;i<=n-l+1;i++){                j=i+l-1;                le=dp[i+1][j][0]+d[i+1]-d[i];   //按完端点的按钮在从下个区间的左或者右开始按                re=dp[i+1][j][1]+d[j]-d[i];                if(le<=re){                    dp[i][j][0]=le;                    path[i][j][0]=0;                }                else{                    dp[i][j][0]=re;                    path[i][j][0]=1;                }                if(t[i]<=dp[i][j][0])                dp[i][j][0]=INF;                le=dp[i][j-1][0]+d[j]-d[i];                re=dp[i][j-1][1]+d[j]-d[j-1];                if(le<=re){                    dp[i][j][1]=le;                    path[i][j][1]=0;                }                else{                    dp[i][j][1]=re;                    path[i][j][1]=1;                }                if(t[j]<=dp[i][j][1])                dp[i][j][1]=INF;            }        }        if(dp[1][n][0]<INF){                    //输出的时候最后一个数后面不能有空格            tmp=path[1][n][0];                  //这题好像没有PE,因此会造成WA            printf("1");            l=2,r=n;        }        else if(dp[1][n][1]<INF){            tmp=path[1][n][1];            printf("%d",n);            l=1,r=n-1;        }        else{            puts("Mission Impossible");            continue;        }        while(l<=r){            if(tmp==0){                tmp=path[l][r][0];                printf(" %d",l++);            }            else{                tmp=path[l][r][1];                printf(" %d",r--);            }        }        printf("\n");    }    return 0;}


 

0 0
原创粉丝点击