思路:
f[i][j]表示前i步在第j个小组的最短天数
转移:f[i][j]=min(f[i-1][j],f[i-1][x])+f[i][j]
注:当j==1时,x=m;else x=j-1
1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 long long c[1001][2001],f[1001][2001]; 5 long long min(long long,long long); 6 int main(){ 7 int h,l; 8 long long ans=10000000000; 9 scanf("%d %d",&l,&h); 10 for (int i=1;i<=h;i++) 11 for (int j=1;j<=l;j++) 12 scanf("%d",&c[i][j]); 13 for (int i=1;i<=l;i++) 14 for (int j=1;j<=h;j++){ 15 if (j==1) 16 f[j][i]=min(f[h][i-1],f[j][i-1])+c[j][i]; 17 else 18 f[j][i]=min(f[j-1][i-1],f[j][i-1])+c[j][i]; 19 } 20 for (int i=1;i<=h;i++) 21 ans=min(ans,f[i][l]); 22 printf("%lld",ans); 23 return 0; 24 } 25 long long min(long long x,long long y){ 26 return x<y?x:y; 27 }