udebug上的数据都过了(请无视中文乱码)
不知道为什么会TLE
#include<bits/stdc++.h>
using namespace std;
const int MX=2*1000+10;
#define LL long long
#define inf 0x3f3f3f3f
#define modn 998244353
inline int read()
{
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
int dp[MX][MX];
int n,m;
int w[MX][MX];
int ans=inf,head;
int pat[MX][MX];
inline void csh()
{
memset(dp,0x3f,sizeof(dp));
ans=inf;
memset(pat,0,sizeof(pat));
}
int main(int argc, char const *argv[])
{
// freopen("debug.in","r",stdin);
// freopen("debug.out","w",stdout);
while(cin>>m>>n)
{
csh();
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
w[i][j]=read();
}
}
for(int j=n;j>=1;j--)
{
for(int i=1;i<=m;i++)
{
if(j==n)
{
dp[i][j]=w[i][j];//杈圭晫鑷劧灏辨槸w
continue;
}
int f[3]={i,i-1,i+1};//orzzzzzzzzz
if(f[1]<=0) f[1]=m;
if(f[2]>=m+1) f[2]=1;
sort(f,f+3);
dp[i][j]=inf;
for(int k=0;k<3;k++)
{
int value=dp[f[k]][j+1]+w[i][j];
if(value<dp[i][j])//婊¤冻瀛楀吀搴忔渶灏?
{
dp[i][j]=value;
pat[i][j]=f[k];
}
}
}
}
for(int i=1;i<=m;i++)
{
if(dp[i][1]<ans)
{
ans=dp[i][1];
head=i;
}
}
//printf("head: %d\n",head);
printf("%d",head);
for(int i=pat[head][1],j=2;j<=n;i=pat[i][j],j++)
{
printf(" %d",i);
}
puts("");
printf("%d\n",ans);
}
return 0;
}