P1130 红牌
我们可以用 f [ i ] [ j ] 表示第 i 步在第 j 个小组完成的最小天数和
每次做完一步后可以选择不换小组(即 j )或者换到下一个小组(即 j + 1,Ps : M组换到1组)
所以转移方程为 f [ i ] [ j ] = min ( f [ i - 1 ] [ j ] , f [ i - 1 ] [ j - 1 ] ) + a [ i ] [ j ] ;
注意 f [ i - 1 ] [ 0 ] = f [ i - 1 ] [ m ] ;
最后比较最后一步在哪个小组完成时总天数最少
DP代码
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> using namespace std; int n,m; int a[2001][2001],f[2001][2001]; int main() { cin>>n>>m; for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) cin>>a[j][i]; for(int i=1;i<=n;i++) { f[i-1][0]=f[i-1][m]; for(int j=1;j<=m;j++) f[i][j]=min(f[i-1][j],f[i-1][j-1])+a[i][j]; } int ans=f[n][1]; for(int i=2;i<=m;i++) ans=min(ans,f[n][i]); cout<<ans; return 0; }