dp循环顺序反了。
改一下就可以AC了:
```cpp
#include<bits/stdc++.h>
using namespace std;
#define N 2010
#define LL long long
LL f[N][N];
int n,m,a[N][N];
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
scanf("%d",&a[i][j]);
for(int i=1;i<=m;i++)
f[i][1]=a[i][1];
for(int j=2;j<=n;j++)
for(int i=1;i<=m;i++)
f[i][j]=min(f[i][j-1],i!=1?f[i-1][j-1]:f[m][j-1])+a[i][j];
LL res=3000000000;
for(int i=1;i<=m;i++)
res=min(res,f[i][n]);
printf("%lld",res);
return 0;
}
```
@[EZAIJ](/user/823725)
by lqsy002 @ 2024-03-08 20:00:43
@[lqsy002](/user/1216630) 大佬能具体点一下为啥吗?或者类似于哪个模型?
by EZAIJ @ 2024-03-08 21:16:48
@[EZAIJ](/user/823725)
个人认为可以理解为一个上下左右相连的矩阵型数字三角形,转移方程也是类似的。
每一次dp的时候都特判一下是否换行,就转化回去了。
by lqsy002 @ 2024-03-08 21:23:43
@[lqsy002](/user/1216630) 大佬帮我看看这个可以过样例但我不知道哪错了
```cpp
// Problem:
// P1130 红牌
//
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1130
// Memory Limit: 125 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include<iostream>
#include<algorithm>
//#include<cstdio>
#include<cstring>
#define ll long long
#define endl '\n'
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define N 2010 //1e6+100
using namespace std;
int n,m,x;
int mp[N][N];
int dp[N][N];
int main(){
//ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>n>>m;
rep(i,1,m){
rep(j,1,n){
cin>>x;
mp[j][i]=x;
}
}
memset(dp,0x3f,sizeof dp);
rep(i,0,m){
dp[n][i]=mp[n][i];
}
per(i,n-1,1){
rep(j,1,m){
dp[i][j]=min(dp[i+1][j],dp[i+1][(j+1)%m+1])+mp[i][j];
}
}
int MIN=1e9;
rep(i,1,m){
MIN=min(MIN,dp[1][i]);
}
cout<<MIN;
return 0;
}
/*
2 3 4 2
6 6 2 6
1 2 3 1
8 6 6 8
*/
```
by lightme @ 2024-03-26 16:47:40
@[lightme](/user/940317)
特判 $j=m$ 的地方写错了。
```cpp
#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define N 2010 //1e6+100
using namespace std;
int n,m,x;
int mp[N][N];
int dp[N][N];
int main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>n>>m;
rep(i,1,m)
rep(j,1,n){
cin>>x;
mp[j][i]=x;
}
memset(dp,0x3f,sizeof dp);
rep(i,0,m)
dp[n][i]=mp[n][i];
per(i,n-1,1)
rep(j,1,m)
if(j==m)
dp[i][j]=min(dp[i+1][j],dp[i+1][1])+mp[i][j];
else
dp[i][j]=min(dp[i+1][j],dp[i+1][j+1])+mp[i][j];
int MIN=1e9;
rep(i,1,m){
MIN=min(MIN,dp[1][i]);
}
cout<<MIN;
return 0;
}
```
by lqsy002 @ 2024-03-26 19:03:18