jzoj 1274. 游历的路线(lines.pas/cpp)

这题DP,考场时把数组给开小了。。。
设f[i][j]表示在第j天到了城市i的最小花费。
输出f[n][m]即可。
时间复杂度O(n2m)
上标:

#include
#include
#include
using namespace std;
int n,m,a[110][110][21],x;
int c[110][110],f[110][210];

inline int read()
{
	int x=0; char c=getchar();
	while (c<'0' || c>'9') c=getchar();
	while (c>='0' && c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return x;
}

int main()
{
	freopen("lines.in","r",stdin);
	freopen("lines.out","w",stdout);
	n=read(),m=read();
	for (int i=1;i<=n;i++)
		for (int j=1;j<=n;j++)
		{
			if (i==j) continue;
			c[i][j]=read();
			for (int k=1;k<=c[i][j];k++)
				a[i][j][k]=read();
		}
	memset(f,10,sizeof(f));
	f[1][0]=0;
	for (int k=1;k<=m;k++)
		for (int i=1;i<=n;i++)
			for (int j=1;j<=n;j++)
			{
				if (i==j) continue;
				x=a[i][j][(k-1)%c[i][j]+1];
				if (!x) continue;
				f[j][k]=min(f[j][k],f[i][k-1]+x);
			}
	if (f[n][m]==f[0][0]) puts("0");
	else printf("%d\n",f[n][m]);
	return 0;
}

你可能感兴趣的:(DP)