欧拉 本蒟蒻第一个自己想出来的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; }
时间: 2024-10-13 12:25:58