洛谷P1130 红牌 动态规划
洛谷P1130 红牌
动态规划
状态转移方程 dp[ j ][ i ] = dp[ j-1 ][ i-1 ] + dp[ j ][ i-1 ] 然后 1 的时候判一下就行
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cmath> 4 #include <cstring> 5 #include <string> 6 #include <algorithm> 7 #include <iostream> 8 #include <iomanip> 9 using namespace std ; 10 11 const int maxn = 2011,maxm = 1011,inf = 2e9 ; 12 int m,n,mi ; // m 小组 n 步数 13 int a[maxm][maxn],dp[maxm][maxn] ; 14 15 inline int read() 16 { 17 char ch = getchar() ; 18 int x = 0,f = 1 ; 19 while(ch<'0'||ch>'9') { if(ch=='-') f = -1 ; ch = getchar() ; } 20 while(ch>='0'&&ch<='9') { x = x*10 + ch -48 ; ch = getchar() ; } 21 return x*f ; 22 } 23 24 inline void init() 25 { 26 n = read() ; m = read() ; 27 for(int i=1;i<=m;i++) 28 for(int j=1;j<=n;j++) a[ i ][ j ] = read() ; 29 } 30 31 inline void work() 32 { 33 for(int i=1;i<=n;i++) 34 { 35 dp[1][i] = min(dp[1][i-1],dp[m][i-1]) + a[ 1 ][ i ] ; 36 for(int j=2;j<=m;j++) 37 dp[j][i] = min( dp[ j-1 ][ i-1 ],dp[ j ][ i-1 ] )+a[ j ][ i ] ; 38 } 39 } 40 41 int main() 42 { 43 init() ; 44 work() ; 45 mi = inf; 46 for(int i=1;i<=m;i++) if(dp[i][n] < mi) mi = dp[i][n] ; 47 printf("%d\n",mi) ; 48 return 0 ; 49 }