目录
题目概述:
AC代码:
#include<iostream>
#include<algorithm>
using namespace std;
#define maxsize 2000
int dp[maxsize+1][maxsize+1];//dp[i][j]表示在第i个小组完成第j步时的总计最小时间
int t[maxsize+1][maxsize+1];
int main()
{
std::ios::sync_with_stdio(false);
int n,m;
cin>>n>>m;
for(int i=1;i<=m;++i)
for(int j=1;j<=n;++j)
{
cin>>t[i][j];
}
for(int i=1;i<=m;++i)
{
dp[i][1]=t[i][1];//对应好初始条件
}
int ans=0x7fffffff;
for(int j=2;j<=n;++j)//从步骤开始循环,才能得到正确答案
for(int i=1;i<=m;++i)
{
if(i!=1)
dp[i][j]=min(dp[i-1][j-1],dp[i][j-1])+t[i][j];
else
dp[i][j]=min(dp[1][j-1],dp[m][j-1])+t[i][j];
if(j==n)//最后一步开始记录答案
ans=min(ans,dp[i][j]);
}
cout<<ans<<endl;
return 0;
}
分析思路:
1.定义dp[i][j]表示到第i组第j个步骤的答案。
2.最后的答案是dp[i][n],即所有组最后一个步骤答案的最小值。
3.一定要注意好递推顺序。背包问题做习惯了,这题如果不从j开始递推而从i开始递推就会严重错误,因为会导致后面要用到的答案还没有计算出来。正确的递推应该从j,也就是步骤阶段开始,也就是”纵向”的。这样才能确保每次计算前一项的答案都已经计算过的可以使用。