两棵树

题目描述

这里写图片描述

树形dp

设f[i][j]表示第一棵树中以i为根的子树和第二棵树中以j为根的子树实现对称所需要的最小代价,而i的儿子x和j的儿子y的f[x][y]的值是已经求出来的,如何转移到f[i][j]

二分图带权匹配

我们要求的其实就是个最小权完备匹配(和最大权类似,把边权取反即可),对于儿子数不同的点对,我们可以直接添点,边的权值即为对应点的size。由于费用流不会,果断选择km算法。

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
const int maxn=1000+5;
int son1[maxn][maxn],son2[maxn][maxn],n1[maxn],n2[maxn],w[maxn][maxn],a[maxn],b[maxn],sl[maxn],s1[maxn],s2[maxn],w1[maxn][maxn],f[maxn];
int i,n,t1,t2;
bool bz1[maxn],bz2[maxn];
void df1(int x){
    int i;
    s1[x]=1;
    fo(i,1,n1[x]) {
        df1(son1[x][i]);
        s1[x]+=s1[son1[x][i]];
    }
}
void df2(int x){
    int i;
    s2[x]=1;
    fo(i,1,n2[x]) {
        df2(son2[x][i]);
        s2[x]+=s2[son2[x][i]];
    }
}
bool find(int x,int m,int x2){
    if (bz1[x]) return 0;
    bz1[x]=1;
    int i;
    fo(i,1,m){
        int j=son2[x2][i];
        if (bz2[j]) continue;
        int p=a[x]+b[j]-w1[x][j];
        if (p==0){
            bz2[j]=1;
            if ((!f[j])||(find(f[j],m,x2))){
                f[j]=x;
                return 1;
            } 
        }else sl[j]=min(sl[j],p);
    }
    return 0;
}
void dfs(int x1,int x2){
    if ((s1[x1]==0)||(s2[x2]==0)){
        w[x1][x2]=s1[x1]+s2[x2];
        return;
    } 
    int i,j,m=max(n1[x1],n2[x2]);
    if (m==0) {
        w[x1][x2]=0;
        return;
    }
    if (n1[x1]<m) {
        fo(i,n1[x1]+1,m) if (!son1[x1][i])son1[x1][i]=++t1;
    }else fo(i,n2[x2]+1,m) if (!son2[x2][i]) son2[x2][i]=++t2;
    fo(i,1,m)
    fo(j,1,m) {
        dfs(son1[x1][i],son2[x2][j]);
        w1[son1[x1][i]][son2[x2][j]]=-w[son1[x1][i]][son2[x2][j]];
    }   
    fo(i,1,m) {
        a[son1[x1][i]]=-10000;
        f[son2[x2][i]]=0;
        fo(j,1,m) a[son1[x1][i]]=max(a[son1[x1][i]],w1[son1[x1][i]][son2[x2][j]]);
    }
    fo(i,1,m){
        fo(j,1,m) sl[son2[x2][j]]=10000;
        while (1){
            fo(j,1,m) bz1[son1[x1][j]]=0;
            fo(j,1,m) bz2[son2[x2][j]]=0;
            if (find(son1[x1][i],m,x2)) break;
            int d=10000;
            fo(j,1,m) if (!bz2[son2[x2][j]]) d=min(d,sl[son2[x2][j]]);
            fo(j,1,m) {
                if (bz1[son1[x1][j]]) a[son1[x1][j]]-=d;
                if (bz2[son2[x2][j]]) b[son2[x2][j]]+=d;else sl[son2[x2][j]]-=d;
            }
        }
    }
    w[x1][x2]=0;
    fo(i,1,m) w[x1][x2]=w[x1][x2]-w1[f[son2[x2][i]]][son2[x2][i]];
}
int main(){
    scanf("%d",&n);t1=n+1;
    fo(i,2,n+1){
        int x;
        scanf("%d",&x);x++;
        son1[x][++n1[x]]=i;
    }
    scanf("%d",&n);t2=n+1;
    fo(i,2,n+1){
        int x;
        scanf("%d",&x);x++;
        son2[x][++n2[x]]=i;
    }
    df1(1),df2(1);
    dfs(1,1);
    printf("%d\n",w[1][1]);
}
资源下载链接为: https://pan.quark.cn/s/140386800631 通用大模型文本分类实践的基本原理是,借助大模型自身较强的理解和推理能力,在使用时需在prompt中明确分类任务目标,并详细解释每个类目概念,尤其要突出类目间的差别。 结合in-context learning思想,有效的prompt应包含分类任务介绍及细节、类目概念解释、每个类目对应的例子和待分类文本。但实际应用中,类目和样本较多易导致prompt过长,影响大模型推理效果,因此可先通过向量检索缩小范围,再由大模型做最终决策。 具体方案为:离线时提前配置好每个类目的概念及对应样本;在线时先对给定query进行向量召回,再将召回结果交给大模型决策。 该方法不更新任何模型参数,直接使用开源模型参数。其架构参考GPT-RE并结合相关实践改写,加入上下文学习以提高准确度,还使用BGE作为向量模型,K-BERT提取文本关键词,拼接召回的相似例子作为上下文输入大模型。 代码实现上,大模型用Qwen2-7B-Instruct,Embedding采用bge-base-zh-v1.5,向量库选择milvus。分类主函数的作用是在向量库中召回相似案例,拼接prompt后输入大模型。 结果方面,使用ICL时accuracy达0.94,比bert文本分类的0.98低0.04,错误类别6个,处理时添加“家居”类别,影响不大;不使用ICL时accuracy为0.88,错误58项,可能与未修改prompt有关。 优点是无需训练即可有较好结果,例子优质、类目界限清晰时效果更佳,适合围绕通用大模型api打造工具;缺点是上限不高,仅针对一个分类任务部署大模型不划算,推理速度慢,icl的token使用多,用收费api会有额外开销。 后续可优化的点是利用key-bert提取的关键词,因为核心词语有时比语意更重要。 参考资料包括
内容概要:本文详细介绍了哈希表及其相关概念和技术细节,包括哈希表的引入、哈希函数的设计、冲突处理机制、字符串哈希的基础、哈希错误率分析以及哈希的改进与应用。哈希表作为一种高效的数据结构,通过键值对存储数据,能够快速定位和检索。文中讨论了整数键值和字符串键值的哈希方法,特别是字符串哈希中的多项式哈希及其优化方法,如双哈希和子串哈希的快速计算。此外,还探讨了常见的冲突处理方法——拉链法和闭散列法,并提供了C++实现示例。最后,文章列举了哈希在字符串匹配、最长回文子串、最长公共子字符串等问题中的具体应用。 适合人群:计算机科学专业的学生、算法竞赛选手以及有一定编程基础并对数据结构和算法感兴趣的开发者。 使用场景及目标:①理解哈希表的工作原理及其在各种编程任务中的应用;②掌握哈希函数的设计原则,包括如何选择合适的模数和基数;③学会处理哈希冲突的方法,如拉链法和闭散列法;④了解并能运用字符串哈希解决实际问题,如字符串匹配、回文检测等。 阅读建议:由于哈希涉及较多数学知识和编程技巧,建议读者先熟悉基本的数据结构和算法理论,再结合代码实例进行深入理解。同时,在实践中不断尝试不同的哈希策略,对比性能差异,从而更好地掌握哈希技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值