jzoj 1274. 游历的路线(lines.pas/cpp)
这题DP,考场时把数组给开小了。。。
设f[i][j]表示在第j天到了城市i的最小花费。
输出f[n][m]即可。
时间复杂度O(n2m)
上标:
#include<cstdio>
#include<cstring>
#include<algorithm>
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;
}
转载需注明出处。