码迷,mamicode.com
首页 > 其他好文 > 详细

Luogu【P1130】红牌(DP)

时间:2017-06-22 21:52:07      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:www   mem   ems   一个   ==   git   class   lin   tps   

欧拉 本蒟蒻第一个自己想出来的DP题

请移步题目链接

调了半天。i从1到n,j从1到m。

f[i][j]表示的是第i道工序在第j个小组办完所花的最短时间。

因为要用到上一个状态,而上一个状态要么是同一小组,要么是上一个小组

所以j的做法跟题目是反着的

so转移方程

f[i][j]=min(f[i-1][j],f[i-1][j==1?n:j-1]);
f[i][j]+=mp[j][i];

然后就找到完成所有工序耗时最短的组就行啦

#include<cstdio>
#include<cstdlib>
#include<cctype>
#include<cstring>

int mp[2010][2010];
int f[2010][2010];

inline long long read(){
    long long num=0,f=1;
    char ch=getchar();
    while(!isdigit(ch)){
        if(ch==-)    f=-1;
        ch=getchar();
    }
    while(isdigit(ch)){
        num=(num<<1)+(num<<3)+ch-0;
        ch=getchar();
    }
    return num*f;
}

inline long long min(long long a,long long b){    return a<b?a:b;    }
int ans=0x7fffffff;


int main(){
    memset(f,127,sizeof(f));
    int m=read(),n=read();
    for(int i=1;i<=n;++i){
        f[0][i]=0;
        for(int j=1;j<=m;++j)    mp[i][j]=read();
    }
    for(int i=1;i<=m;++i){
        for(int j=1;j<=n;++j){
            f[i][j]=min(f[i-1][j],f[i-1][j==1?n:j-1]);
            f[i][j]+=mp[j][i];
            //printf("%d ",f[i][j]);
        }
        //printf("\n");
    }
    
    for(int i=1;i<=n;++i)    ans=min(ans,f[m][i]);
    printf("%d",ans);
    return 0;
}

 

Luogu【P1130】红牌(DP)

标签:www   mem   ems   一个   ==   git   class   lin   tps   

原文地址:http://www.cnblogs.com/cellular-automaton/p/7067116.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!