using namespace std;
typedef long long ll;
const ll M = 305, inf = 1e18;
ll n, m, cost, dp[M];
ll mv = inf, sv = inf, mi; //最小值、次小值、最小值的下标
int main() {n = read(), m = read();for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {cost = read();if (i == 1) //边界状态dp[j] = cost;else { //非边界状态if (j != mi) //若当前颜色非前一天最值的颜色dp[j] = mv + cost; //从前一天最值转移else //若当前颜色是前一天最值颜色dp[j] = sv + cost; //从前一天次值转移}}mv = inf, sv = inf; //初始化最值for (int j = 1; j <= m; j++)if (mv > dp[j]) { //获取第i天状态的最小和次小值sv = mv;mv = dp[j];mi = j;} else if (sv > dp[j])sv = dp[j];}write(mv);return 0;
}`