With inspiration from the comments I arrived at the following idea:
the maximum weight matching on the cycle is converted to a maximum weight matching on a path that is generated by splitting a vertex, preferably between two non-positive edges or a positive and non-positive edge.
If we have to split between two positive edges and both are in the maximum weight matching of the resulting path graph, we remove the lighter of the two edges to obtain the heaviest cycle matching.
A key observation is that in a maximum weight matching of a path graph one can't have a contiguous sequence of more than two edges of positive weight that are not in the matching.
For the following description it assumed that all non-positive edges have been removed from the path.
That leads to the following reduction to a longest path problem:
- attach a sentinel edge of weight zero to the end of the path
- generate a digraph whose nodes are the path-edges
- connect pairs of nodes, that represent edges that are separated by 1 or 2 path edges, with a link that is directed from start to end of the path
- associate the edge weights with the nodes.
- construct the longest path by going from end-edge to start-edge and always let a node point to the target node with highest distance label
and set the distance label of the current node to the sum of its successor distance plus its own weight.
- report the cycle edges that correspond to the nodes of the longest path.
The complexity of that algorithm obviously is $O(n)$