题目链接:点击查看
题意:给你n*m的矩阵,求从第一行到第n行值加起来的最小路径,(i,j)可以走向(i+1,j-1) (i+1,j) (i+1,j+1) ,尽可能向右走
题解:dp一遍即可,尽量取右边的
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
int dp[110][110];
int pre[110][110];
int n,m;
int main()
{
int T;
int nn=1;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
memset(dp,INF,sizeof(dp));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&dp[i][j]);
int minn,id;
for(int i=2;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
minn=dp[i-1][j-1],id=j-1;
if(minn>=dp[i-1][j]) minn=dp[i-1][j],id=j;
if(minn>=dp[i-1][j+1]) minn=dp[i-1][j+1],id=j+1;
dp[i][j]+=minn;
pre[i][j]=id;
}
}
minn=dp[n][1],id=1;
for(int i=2;i<=m;i++)
{
if(dp[n][i]<=minn)
{
minn=dp[n][i];
id=i;
}
}
vector<int> v;
v.push_back(id);
int cnt=n;
while(cnt>1)
{
id=pre[cnt][id];
cnt--;
v.push_back(id);
}
printf("Case %d\n",nn++);
for(int i=1;i<=n;i++)
printf("%d%c",v[n-i]," \n"[i==n]);
}
return 0;
}