悬赏关注*1,求助0分

P1130 红牌

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


|