hdu 4526 水DP

来源:互联网 发布:概率矩阵分解 视频 编辑:程序博客网 时间:2024/06/05 20:56

徘徊再对错边缘啊 这个也错了一次



状态很明显就是二维的 过去了几辆车 处理完了几个人 然后每次for循环更新即可

注意要分段啊

每段的人和每段的上车人数要分清楚

还有另外一种就是从全局进行考虑 然后把所有上车的人的时间计算进去

这样的也比较简单 可以少记录分段的时间差



首先是分段处理的方法:

#include<iostream>#include<cstdio>#include<algorithm>using namespace std;#define inf 999999999int main(){    int dp[111][111];    int n,k,d,s,ti,zi;    int t;scanf("%d",&t);    while(t--){        scanf("%d%d%d%d",&n,&k,&d,&s);                for(int i=0;i<111;++i)            for(int j=0;j<111;++j)                dp[i][j]=inf;                dp[0][0]=0;                int past=0;                for(int i=1;i<=k;++i){            scanf("%d%d",&ti,&zi);            for(int j=0;j<=n;++j)                if(dp[i-1][j]!=inf){                    for(int z=0;z<=zi;++z){                        if(j+z<=n){                            dp[i][j+z]=min(dp[i][j+z],dp[i-1][j]+(ti-past)*(n-j)+(z==0?0:d));//                       printf("%d %d %d %d\n",i,j+z,z,dp[i][j+z]);                        }                    }                }            past=ti;        }        if(dp[k][n]==inf)printf("impossible\n");        else printf("%d\n",dp[k][n]);    }    return 0;}



然后是总体考虑的方法:

#include<iostream>#include<cstdio>#include<algorithm>using namespace std;#define inf 999999999int main(){    int dp[111][111];    int n,k,d,s,ti,zi;    int t;scanf("%d",&t);    while(t--){        scanf("%d%d%d%d",&n,&k,&d,&s);                for(int i=0;i<111;++i)            for(int j=0;j<111;++j)                dp[i][j]=inf;                dp[0][0]=0;                for(int i=1;i<=k;++i){            scanf("%d%d",&ti,&zi);            for(int j=0;j<=n;++j)                if(dp[i-1][j]!=inf){                    for(int z=0;z<=zi;++z){                        if(j+z<=n){                            dp[i][j+z]=min(dp[i][j+z],dp[i-1][j]+ti*z+(z==0?0:d));                            //                            printf("%d %d %d %d\n",i,j+z,z,dp[i][j+z]);                        }                    }                }        }        if(dp[k][n]==inf)printf("impossible\n");        else printf("%d\n",dp[k][n]);    }    return 0;}


0 0
原创粉丝点击