UVALive - 4097:Yungom(逼近 贪心)(DP)
2024-09-07 01:51:00
pro:有D个字母,每个字母有自己的权值,现状需要用它们拼出N个单词,使得这些单词互相不为另外一个的前缀。 且单词的权值和最小。D<=200; N<=200;
sol:如果建立字典树,那个每个单词的权值权值救赎根到叶子的路径权重和。 感觉有点想哈夫曼树,但是没什么大的关系,因为不能倒推。
由于ND比较小,我们直接贪心,维护一个大小为N+D的数组b[],一直更新,原则如下:每次排序b[],把 b[1]替换为b[1]+a[];一直操作,直到不能再变小为止。
#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
const ll inf=1LL<<;
ll a[maxn],b[maxn];
int main()
{
int N,D;ll ans;
while(~scanf("%d%d",&N,&D)&&(N||D)){
ans=;
rep(i,,D) scanf("%lld",&a[i]);
sort(a+,a+D+);
rep(i,,D) b[i]=a[i];
rep(i,,N) b[i+D]=inf;
rep(i,,N) ans+=b[i];
while(){
rep(i,,D) b[i+N]=b[]+a[i];
b[]=b[N+D];
sort(b+,b+N+D);
ll sum=;
rep(i,,N) sum+=b[i];
if(sum<ans) ans=sum;
else break;
}
printf("%lld\n",ans);
}
return ;
}
当然,也可以DP来做,dp[i][j]表示根有i个儿子,j个叶子时的最小代价。
最新文章
- Android 死锁和重入锁
- F#之旅1 - Why use F#?为什么要用F#?
- Python学习笔记 for windows 二
- Wireshark工控协议
- 【转】Eclipse Class Decompiler——Java反编译插件
- JPG 批量压缩、 PNG32、PNG24转PNG 透明批量压缩工具 【JPNG】 支持多级目录
- Linux远程管理
- 【转】使用Xcode 6将你的项目本地化
- java传输json数据用md5加密过程
- mysql命令语句来去除掉字段中空格字符的方法
- 《WPF程序设计指南》读书笔记——第8章 依赖属性
- Storyboards vs NIB vs Code 大辩论
- char图表
- DataTable转换成List
- matrix67:kmp算法详解
- MappedByteBuffer
- 网络编程基础【day10】:进程与线程介绍(一 )
- 论文阅读:CNN-RNN: A Unified Framework for Multi-label Image Classification
- 隔行变色&;&;鼠标移入变色
- mysql为用户开启Trigger的权限