摘要:
一道树形DP+01背包的题。用dp[k][j]表示以k的根的树用j天最多可以得到多少宝藏,m是天数限制,因为要往返,所以将m/2以后就可以直接计算单程的值了。#include <stdio.h>#include <string.h>#include <stdlib.h>#include <algorithm>///dp[k][j]表示以k的根的树用j天最多可以得到多少宝藏using namespace std;const int MAXN = 105;int e;int n, k, m;int first[MAXN], next[MAXN < 阅读全文
摘要:
题目给出的是一个环状的序列,所以可以在序列后面复制前k个数字。如果用sum[i]来表示复制过后的序列的前i个数的和,那么任意一个子序列[i..j]的和就等于s[j]-s[i-1]。对于每一个j,用s[j]减去最小的一个s[i](i>=j-k+1)就可以得到以j为终点长度不大于k的和最大的序列了。将原问题转化为这样一个问题后,就可以用单调队列解决了。单调队列确实是一种很实用的结构,本题中保持单调递增,队首元素就是我们需要的那个最小元素,保证待插入的j-1位置对应的sum值要大于队尾元素。#include <stdio.h>#include <string.h>#in 阅读全文