DP在SPOJ SERVICES中声明

时间:2016-07-14 04:47:57

标签: dynamic-programming

我在SPOJ的问题SERVICES中遇到了问题。我试图解决它并提出以下DP状态[posofA] [posofB] [posofC] [NextToMove]。但是看看这些限制,我认为它会给MLE。在尝试了一天之后,我用Google搜索并发现了关于问题中对称性的博客。尽管我付出了最大努力,但我无法理解。有人可以帮忙,腾出时间帮助我。感谢。

1 个答案:

答案 0 :(得分:1)

请注意,您可以放下 posOfC ,并始终按最后请求的位置来表示 posOfC 。在处理请求时,您可以轻松获得上一个职位。现在您拥有3个合作伙伴的所有职位。将其中之一发送到新请求的位置,以确保它们全部位于不同的位置。

int f(int pos,int a,int b)
{
        if(pos == req.sz)
                return 0;

        // last position
        int c = req[pos-1];

        // current position we are sending one of them
        int to = req[pos];

        if( dp[pos][a][b] != -1)
                return dp[pos][a][b];

        int ans = inf;
        // a goes to current request position
        if(b != c && b != to && c != to)
                ans = min(ans,f(pos+1,b,c) + cost[a][to]);
        // b goes to current request position
        if(a != c && a != to && c != to)
                ans = min(ans,f(pos+1,a,c) + cost[b][to]);
        // c goes to current request position
        if(a != b && a != to && b != to)
                ans = min(ans , f(pos+1,a,b) + cost[c][to]);

        return dp[pos][a][b] = ans;
}

要求的前三个元素将为 1,2,3 。致电f(3,1,2)获得答案。