Mobile Service Page269 线性dp

Mobile Service Page269 线性dp

1.如果直接做的话是 d p [ i ] [ p o s 1 ] [ p o s 2 ] [ p o s 3 ] dp[i][pos1][pos2][pos3] dp[i][pos1][pos2][pos3],显然超时,将冗余信息除掉后,降了个维度就可以做了。(根本想不到)
2.要注意,同一个点不能两个人同时到达,所以要加个判断语句。

代码

int dp[1007][maxn][maxn],cost[maxn][maxn],n,m,x[1007];
int main()
{
    scanf("%d%d",&n,&m);
    rep(i,1,n)rep(j,1,n)scanf("%d",&cost[i][j]);
    rep(i,1,m)scanf("%d",&x[i]);
    rep(i,0,m)rep(j,1,n)rep(k,1,n)dp[i][j][k]=INF;
    dp[0][1][2]=0,x[0]=3;
    rep(i,1,m)
    {
        rep(j,1,n)
        {
            rep(k,1,n)
            {
                if (j!=x[i]&&k!=x[i])dp[i][j][k]=min(dp[i][j][k],dp[i-1][j][k]+cost[x[i-1]][x[i]]);
                if (x[i-1]!=x[i]&&k!=x[i])dp[i][x[i-1]][k]=min(dp[i][x[i-1]][k],dp[i-1][j][k]+cost[j][x[i]]);
                if (x[i-1]!=x[i]&&j!=x[i])dp[i][j][x[i-1]]=min(dp[i][j][x[i-1]],dp[i-1][j][k]+cost[k][x[i]]);
            }
        }
    }
    int ans=INF;
    rep(i,1,n)rep(j,1,n)ans=min(ans,dp[m][i][j]);
    W(ans);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值