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