P1040 加分二叉樹【dp+深搜】

題目描述
設一個nn個節點的二叉樹tree的中序遍歷為(1,2,3,…,n1,2,3,…,n),其中數字1,2,3,…,n1,2,3,…,n為節點編號。每個節點都有一個分數(均為正整數),記第ii個節點的分數為di,treedi,tree及它的每個子樹都有一個加分,任一棵子樹subtreesubtree(也包含treetree本身)的加分計算方法如下:

subtreesubtree的左子樹的加分× subtreesubtree的右子樹的加分+subtreesubtree的根的分數。

若某個子樹為空,規定其加分為11,葉子的加分就是葉節點本身的分數。不考慮它的空子樹。

試求一棵符合中序遍歷為(1,2,3,…,n1,2,3,…,n)且加分最高的二叉樹treetree。要求輸出;

(1)treetree的最高加分

(2)treetree的前序遍歷

輸入格式
第11行:11個整數n(n<30)n(n<30),為節點個數。

第22行:nn個用空格隔開的整數,為每個節點的分數(分數 <100<100)。

輸出格式
第11行:11個整數,為最高加分(Ans \le 4,000,000,000≤4,000,000,000)。

第22行:nn個用空格隔開的整數,為該樹的前序遍歷。

輸入輸出樣例
輸入 #1 復制
5
5 7 1 2 10
輸出 #1 復制
145
3 1 2 4 5

代碼:

//#pragma GCC optimize(3,"Ofast","inline")
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <bitset>
#include <set>
#include <utility>
#include <sstream>
#include <iomanip>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define inf 0x3f3f3f3f
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define lep(i,l,r) for(int i=l;i>=r;i--)
#define ms(arr) memset(arr,0,sizeof(arr))
//priority_queue<int,vector<int> ,greater<int> >q;
const int maxn = (int)1e5 + 5;
const ll mod = 1e9+7;
int score[35];
int dp[35][35];
void print(int l,int r) {if(l==r) {printf("%d ",l);return ;}if(l>r) return ;for(int i=l;i<=r;i++) {if(dp[l][r]==dp[l][i-1]*dp[i+1][r]+score[i]) {printf("%d ",i);print(l,i-1);print(i+1,r);return ;}}
}
int main() 
{#ifndef ONLINE_JUDGEfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);#endif//ios::sync_with_stdio(0),cin.tie(0);int n;scanf("%d",&n);rep(i,0,n+1) {rep(j,0,n+1) {dp[i][j]=1;}}rep(i,1,n) {scanf("%d",&score[i]);dp[i][i]=score[i];}score[0]=score[n+1]=1;for(int i=n;i>=1;i--) {for(int j=i;j<=n;j++) {for(int k=i;k<=j;k++) {if(dp[i][k-1]==1&&dp[k+1][j]==1) dp[i][j]=max(dp[i][j],score[k]);else dp[i][j]=max(dp[i][j],dp[i][k-1]*dp[k+1][j]+score[k]);}}}printf("%d\n",dp[1][n]);print(1,n);return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/536254.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536254.shtml
英文地址,請注明出處:http://en.pswp.cn/news/536254.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Helloworld【C#】

c#Helloworld 題目描述 請輸出樣例所示內容 輸出 樣例輸出 ********** Hello,world! ********** using System;namespace ConsoleApp1 {class Program{static void Main(string[] args){Console.WriteLine("**********");Console.WriteLine("Hello,world!&…

判斷閏年【C#】

判斷閏年 題目描述 使用C#編寫一個控制臺應用。輸入-一個年份&#xff0c;判斷是否潤年(被4整除&#xff0c;且不被100整除&#xff0c;或者被400整除)。 是閏年輸出yes&#xff0c;不是輸出no 輸入 一個年份 輸出 yes或者no 樣例輸入 1996 樣例輸出 yes using Syst…

采用遞歸求第n位數【C#】

題目描述 一數列的規則如下&#xff1a;1、1、2、3、5、8、13、21、34......。求第n位數是多少&#xff1f; 輸入 輸入一個正整數&#xff0c;代表求第幾位數字 輸出 輸出第n位數字 樣例輸入 30 樣例輸出 832040 提示 輸入數字必須大于零 using System;namespace C…

歌手的分數【C#】

歌手的分數 題目描述 一青年歌手參加比賽。使用C#編寫-一個控制臺應用&#xff0c;輸入10位評委打分(分值只能為正整數)&#xff0c;計算并輸出歌手的平均分(去掉一一個最高分和一一個最低分)。平均分以double數據類型輸出。 輸入 1 2 3 4 5 6 7 8 9 10 輸出 5.5 樣例輸…

冒泡排序算法(C#)

冒泡排序算法&#xff08;C#&#xff09; 題目描述 使用C#編寫一個控制臺應用。輸入10個整數存入數組中&#xff0c;然后使用冒泡排序算法對一維數組的元素從小到大進行排序&#xff0c;并輸出。 輸入 在控制臺中輸入數字&#xff0c;存入一維數組 輸出 輸出排序后的數…

水仙花數【C#】

題目描述 春天是鮮花的季節&#xff0c;水仙花就是其中最迷人的代表&#xff0c;數學上有個水仙花數&#xff0c;他是這樣定義的&#xff1a; “水仙花數”是指一個三位數&#xff0c;它的各位數字的立方和等于其本身&#xff0c;比如&#xff1a;1531^35^33^3。 現在要求輸出…

C#異或運算符的使用【C#】

C#異或運算符的使用 題目描述 編寫一個控制臺應用&#xff0c;采用異或運算符&#xff0c;實現兩個整型變量值的交換。并在Program類的Main進行驗證。 輸入 依次輸入2個整數 輸出 輸出交換前、后兩個變量的值 樣例輸入 12 78樣例輸出 before exchange first12,second7…

C#類方法【C#】

C#類方法 題目描述 在類Class1中&#xff0c;編寫一個類方法IsEven(string number)用于輸出參數的奇偶性。并在Program類的Main進行驗證性輸出。 class Program { static void Main(string[] args) { Console.Write("Input Integer:&quo…

C#中的Switch語句【C#】

C#中的Switch語句 題目描述 編寫一個控制臺應用&#xff0c;實現以下功能&#xff1a;根據輸入的字符&#xff0c;輸出通過、不通過和輸入成績無效。 &#xff08;1&#xff09;無論輸入A、B、C、D&#xff0c;都輸出通過&#xff1b; &#xff08;2&#xff09;輸入E&#x…

c#輸出最大值、最小值和平均值(A)【C#】

c#輸出最大值、最小值和平均值(A) 題目描述 使用C#編寫一個控制臺應用。輸入10個正整數存入數組中&#xff0c;輸出最大值、最小值和平均值 輸入 輸入10個正整數 輸出 最大值、最小值和平均值 樣例輸入 1 2 3 4 5 6 7 8 9 10 樣例輸出 10 1 5.5 using System;namesp…

c#輸出最大值、最小值和平均值(B)【C#】

c#輸出最大值、最小值和平均值&#xff08;B&#xff09; 題目描述 使用C#編寫一個控制臺應用。輸入若干個正整數存入數組中&#xff08;輸入exit表示輸入結束&#xff09;&#xff0c;輸出最大值、最小值和平均值輸入 輸入若干個正整數存入數組中輸出 輸出最大值、最小值和平…

C#提取文件名【C#】

C#提取文件名 題目描述 假設有一個字符串包含了文件名、擴展名和路徑&#xff0c;如strFileName“D:\C#程序設計\實驗3\MyFile.TXT”。請使用C#編寫一個靜態方法&#xff0c;該方法能夠取出路徑中的文件名“MyFile.TXT”。 輸入 一個包含了文件名&#xff0c;擴展名和路徑的…

C#解密出生日期【C#】

C#解密出生日期 題目描述 使用C#編寫一個靜態方法。該方法能夠根據出生日期&#xff0c;&#xff08;1&#xff09;計算此人的年齡&#xff1b;&#xff08;2&#xff09;計算從現在到其60周歲期間&#xff0c;總共多少天。 輸入 一個人的出生日期&#xff1b; 輸出 第一…

C#判斷回文字符串【C#】

C#判斷回文字符串 題目描述 使用C#編寫一個靜態方法。該方法能夠判斷字符串是否是“回文”&#xff08;即順讀和逆讀相同的字符串&#xff09;。 輸入 一個字符串&#xff1b; 輸出 如果是回文字符串&#xff0c;則輸出“yes”&#xff0c;否則輸出“no”&#xff1b; 樣…

猜數【C#】

猜數 題目描述 編寫一個控制臺程序。以控制臺方式輸入整數&#xff0c;且調用Class1類CompareNum方法判斷是否猜中&#xff0c;給出大了、小了、猜中三種提示。輸入exit表示輸入結束。 輸入 無 輸出 太小了 太大了 猜中了 提示 若輸入的既不是數字&#xff0c;又不是ex…

簡單類及成員實例【C#】

簡單類及成員實例&#xff08;C#&#xff09; 題目描述 簡單類及成員實例。定義了如下圖所示類Student&#xff0c;根據下圖和給出代碼&#xff0c;補寫缺失的代碼。 using System; namespace sample{ class Student { public string studentid;//學號 p…

C#組成考題字符串【C#】

C#組成考題字符串 題目描述 假定已經獲取題庫中的試題號&#xff0c;并存放在數組arrayKT中。例如&#xff0c; int [] arrayKT{10,13,18,19,20,22,30,31}。定義一個靜態成員方法&#xff0c;該方法實現從上述數組中隨機抽出n(narrayKT.Length-1)道考題,并組成一個考題字符串…

c#統計字符串中數字字符的個數【C#】

c#統計字符串中數字字符的個數 題目描述 假設有一個GetNumber方法&#xff08;參數為字符串strSource&#xff09;&#xff0c;編寫一個靜態方法可以用來統計字符串strSource中數字字符的個數。 輸入 輸入一個字符串strSource輸出 strSource字符串中數字字符的個數樣例輸入 s…

c#隨機數的產生與輸出【C#】

c#隨機數的產生與輸出 題目描述 編寫一個實例方法Method01。該方法使用Random類隨機產生n個3位數字&#xff08;如636&#xff09;的隨機正整數&#xff0c;并把產生的隨機數存入數組中并輸出該數組int num Convert.ToInt32(Console.ReadLine()); using System; using System…

C#統計字符出現的個數【C#】

C#統計字符出現的個數 題目描述 編寫一個實例方法getCountChar方法。該方法參數有兩個&#xff0c;第一個參數可以是字符串s&#xff0c;第二個參數為字符c&#xff0c;方法返回值為第二個參數在第一個參數中出現次數。例如&#xff0c;CountChar("6221982",2)返回…