LOJ P507 接竹竿【动态规划】

题目分析:

这仍然是一道显然的DP题。

首先由于取出一段区间的要求是这段区间的两个端点是一样的,所以我们可以考虑用类似于链式前向星的方法储存相同端点的到达。

由数据范围,考虑定一个一维的状态,一维的状态始终是十分好定的:

DP[I]表示前I张扑克处理后能够得到的最大得分

接下来考虑一下转移:

对于第I张照片,有可以取出计分与不去出计分两种情况。
若第I张照片不取出计分,则DP[I]=DP[I-1]
若第I张照片要取出计分,考虑计分的方式:
(1)将第I张照片加入已经有的区间末尾为Num[I]的一堆:
DP[I]=DP[Next[I]]+Sum[I]-Sum[Next[I]];
(2)将第I张照片与前面的一个数为Num[I]的区间合并起来:
DP[I]=DP[Next[I-1]]+Sum[I]+Sum[I]-Sum[Next[I]-1];

于是这道题就已经做完了

参考代码:

for(I=1;I<=N;I++){
    DP[I]=DP[I-1];
    if(Next[I]){
        DP[I]=max(DP[I],DP[Next[I]-1]+Sum[I]-Sum[Next[I]-1]);
        DP[I]=max(DP[I],DP[Next[I]]+Sum[I]-Sum[Next[I]]);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/yanzhenhuai/article/details/80700115