欧拉 本蒟蒻第一个自己想出来的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;
}

 

相关文章:

  • 2021-06-23
  • 2021-11-02
  • 2021-07-12
  • 2021-07-20
  • 2022-02-03
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-10-28
  • 2021-10-21
  • 2021-05-20
  • 2021-11-29
  • 2022-01-16
相关资源
相似解决方案