列表

详情


NC19810. kingdom

描述

X王国有n位官员,编号从1到n。国王是1号官员。除了国王以外,每个官员都有一个上司。我们称这个官员是这个上司的下属。上司的编号总比下属小。
我们定义一个官员的影响力为他所有下属的影响力之和再加1。例如,一个没有下属的官员的影响力是1。国王的影响力总是n。
任何一位有下属的官员总是选择他的下属中影响力最高的作为他的心腹(有若干下属影响力相同的话则会选择编号最小的)。
一位官员得到一条消息后,他就要把消息传达给国王。我们定义一位官员的花费为他将消息传达给国王的花费。国王自己的花费为0。如果一位官员是他上司的心腹,则他的花费等于他上司的花费,否则他的花费为他上司的花费加1。
由于时代和平,消息并不需要传递的太快。我们希望你决定每位官员(除了国王)的上司,使得所有官员的花费之和尽量大。

输入描述

一个整数n(1≤ n≤ 8000)表示包括国王在内的官员的总数。

输出描述

一个整数表示最大的花费之和。

示例1

输入:

4

输出:

2

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Java 解法, 执行用时: 219ms, 内存消耗: 10616K, 提交时间: 2022-09-12 14:25:19

import java.util.*;

public class Main{
public static void main(String args[]){
    Scanner scan = new Scanner(System.in);
    int n = scan.nextInt();
    int [] dp = new int[8010];
    for(int i = 3; i <= n; i++)
        for(int j = 1; j < i; j++)
            dp[i] = Math.max(dp[i], (i - 1) / j * dp[j] + dp[(i - 1) % j] + i - j - 1);
    System.out.println(dp[n]);
}
}

C++14(g++5.4) 解法, 执行用时: 116ms, 内存消耗: 516K, 提交时间: 2020-07-10 22:40:56

#include<bits/stdc++.h>
using namespace std;

const int maxn=8004;

int dp[maxn];

int main(){
    int n;
    cin>>n;
    for(int i=3;i<=n;i++){
        for(int j=1;j<i;j++){
            dp[i]=max(dp[i],(i-1)/j*dp[j]+dp[(i-1)%j]+i-1-j);
        }
    }
    cout<<dp[n]<<endl;
}

C++11(clang++ 3.9) 解法, 执行用时: 154ms, 内存消耗: 440K, 提交时间: 2020-07-15 00:48:01

#include<bits/stdc++.h>
using namespace std;

int main()
{
	int i,j,n,DP[8005]={0};
	scanf("%d",&n);
	for(i=3;i<=n;i++)
		for(j=1;j<i;j++)DP[i]=max(DP[i],(i-1)/j*DP[j]+DP[(i-1)%j]+i-j-1);
	printf("%d\n",DP[n]);
    return 0;
}

上一题