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;
}`