Apple Tree (可以重複走)

2022-04-16 20:59:35 字數 1675 閱讀 2447

題目連線:

題意:一顆樹,n個點,n-1條邊,每個點上有乙個權值,求從1出發,走k步,最多能遍歷到的權值。

思路:很容易想到設dp[x][j]表示x子樹分配j步能獲得最多蘋果數量,但是這樣是不夠的,因為很容易發現只有哪些回到了x點的方案的代價才是子樹大小*2,但是走到最後的時候其實可以不用回到x點。

那麼我們就增加狀態緯度,設dp[i][j][0/1]:給樹i恰好分配j步(回/不回來)i點的最大值。然後分3中情況寫狀態轉移方程:

dp[x][j][0]=max(dp[x][j][0],dp[x][j-k][0]+dp[y][k-2][0]);   //情況①:表示遍歷從左邊的子樹回來x點之後,去y子樹,再回來x點。

dp[x][j][1]=max(dp[x][j][1],dp[x][j-k][0]+dp[y][k-1][1]);  //情況②:表示從左邊回來,去y子樹,不回來x點了

dp[x][j][1]=max(dp[x][j][1],dp[x][j-k][1]+dp[y][k-2][0]);  //情況3:表示從y子樹回來,去左邊,不回來x點了

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define inf 0x3f3f3f3f

#define ls nod<<1

#define rs (nod<<1)+1

const

double eps = 1e-10

;const

int maxn = 100 + 10

;const ll mod = 1e9 + 7

;int sgn(double a)

using

namespace

std;

struct

edge e[maxn

<<1

];int

head[maxn];

intcnt;

int f[maxn][maxn<<1][2

];int

n,m;

inline

void add_edge(int u,int

v) inline

void dfs(int x,int

fa) }}

}int

main()

for (int i = 1;i < n;i++)

dfs(

1,0);

int ans=0

;

for (int i=0;i<=m;i++)

ans=max(ans,max(f[1][i][0],f[1][i][1

]));

cout

<< ans <}

return0;

}

可以重複輸入加密的des演算法

在基本的des演算法 include include include using namespace std 明文打亂表,64 64 int ip 金鑰置換表,64 56 int k 1 壓縮置換,56 48 int k 2 每輪左移的位數 int shiftbits f函式擴充套件置換表,32 4...

不排序和可以重複Key的SortedList

在寫dbscan的時候用到了sortedlist,但是sortedlist不支援相同鍵的儲存,可以使用以下辦法。using system using system.collections namespace testsortedlist private static void printlist s...

mysql索引名字可以重複嗎 MySql索引

索引簡介 索引是乙個單獨的 物理的資料庫結構,它是某個表中一列或若干列值的集合與相應的指向表中資料的指標組成清單。索引的作用相當於書的目錄,可以根據目錄中的頁碼快速定位到所需的內容。索引是一種使記錄有序化的技術,它從邏輯上對記錄進行排序而不影響物理儲存的資料。優點 加速資料檢索 建立唯一可以索引保證...