cf1106e dfs+dp

博客提及稍微进行剪枝操作,可减少干扰,使有用信息不受影响,体现了剪枝在处理干扰方面的作用。

稍微剪枝一下,干扰直接干扰到有用

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
#include <queue>

using namespace std;

struct node
{
    int d,id;long long w;
    friend bool operator<(node a,node b)
    {
        if(a.w==b.w)
            return a.d<b.d;
        return a.w<b.w;
    }
}itm[100005];

int n,m,k;
vector<int> in[100005],out[100005];

int vis[100005];
long long c[100005];
int nxt[100005];
long long dp[100005][205];

long long dfs(int cur,int tm)
{
    if(cur>n)
        return 0;
    //cout<<cur<<" "<<tm<<endl;
    if(dp[cur][tm]!=1e18)
        return dp[cur][tm];

    long long tans=1e18;
    if(nxt[cur]==-1)
    {
        if(cur==n)
            tans=0;
        else
            tans=dfs(cur+1,tm);
    }
    else
    {
        int tid=nxt[cur];
        if(tid>n)
        {
            tans=c[cur];
        }
        else
            tans=c[cur]+dfs(tid,tm);


        for(int i=cur+1;i<=n;i++)
        {
            if(i-cur>tm)
                break;

            if(nxt[i]!=tid)
            {
                tans=min(tans,dfs(i,tm-(i-cur)));
                break;
            }
        }
        if(n-cur+1<=tm)
            tans=0;
    }

    //cout<<cur<<" "<<tm<<" "<<tans<<endl;
    return dp[cur][tm]=tans;
}
int main() {

    while(~scanf("%d%d%d",&n,&m,&k))
    {
        for(int i=0;i<k;i++)
        {
            int l,r;scanf("%d%d%d%lld",&l,&r,&itm[i].d,&itm[i].w);
            itm[i].id=i;
            in[l].push_back(i);out[r+1].push_back(i);
        }
        priority_queue<node>q;

        for(int i=1;i<=n;i++)
        {
            int len=in[i].size();
            for(int j=0;j<len;j++)
            {
                vis[in[i][j]]=1;
                q.push(itm[in[i][j]]);
            }
            len=out[i].size();
            for(int j=0;j<len;j++)
            {
                vis[out[i][j]]=0;
            }

            nxt[i]=-1;
            while(!q.empty() && vis[q.top().id]==0)
                q.pop();
            if(!q.empty())
            {
                nxt[i]=q.top().d+1;
                c[i]=q.top().w;
            }
        }

        for(int i=0;i<=100000;i++)
            for(int j=0;j<=200;j++)
                dp[i][j]=1e18;

        long long ans=dfs(1,m);
        printf("%lld\n",ans);
    }

    return 0;
}

 

本课题设计了一种利用Matlab平台开发的植物叶片健康状态识别方案,重点融合了色彩与纹理双重特征以实现对叶片病害的自动化判别。该系统构建了直观的图形操作界面,便于用户提交叶片影像并快速获得分析结论。Matlab作为具备高效数值计算与数据处理能力的工具,在图像分析与模式分类领域应用广泛,本项目正是借助其功能解决农业病害监测的实际问题。 在色彩特征分析方面,叶片影像的颜色分布常与其生理状态密切相关。通常,健康的叶片呈现绿色,而出现黄化、褐变等异常色彩往往指示病害或虫害的发生。Matlab提供了一系列图像处理函数,例如可通过色彩空间转换与直方图统计来量化颜色属性。通过计算各颜色通道的统计参数(如均值、标准差及主成分等),能够提取具有判别力的色彩特征,从而为不同病害类别的区分提供依据。 纹理特征则用于描述叶片表面的微观结构与形态变化,如病斑、皱缩或裂纹等。Matlab中的灰度共生矩阵计算函数可用于提取对比度、均匀性、相关性等纹理指标。此外,局部二值模式与Gabor滤波等方法也能从多尺度刻画纹理细节,进一步增强病害识别的鲁棒性。 系统的人机交互界面基于Matlab的图形用户界面开发环境实现。用户可通过该界面上传待检图像,系统将自动执行图像预处理、特征抽取与分类判断。采用的分类模型包括支持向量机、决策树等机器学习方法,通过对已标注样本的训练,模型能够依据新图像的特征向量预测其所属的病害类别。 此类课题设计有助于深化对Matlab编程、图像处理技术与模式识别原理的理解。通过完整实现从特征提取到分类决策的流程,学生能够将理论知识与实际应用相结合,提升解决复杂工程问题的能力。总体而言,该叶片病害检测系统涵盖了图像分析、特征融合、分类算法及界面开发等多个技术环节,为学习与掌握基于Matlab的智能检测技术提供了综合性实践案例。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
CF2004A Closet Point是一个常见的数据结构题,通常涉及最小化操作次数的问题。题目描述的是在一个二维网格上找到最短距离的点对,每次可以沿着水平、垂直或对角线移动一格。这个题目常常可以用哈希表(Disjoint Set Union,简称DSU)或者最近点对搜索(Floyd-Warshall Algorithm)来解决。 C++题解概述: ```cpp #include <iostream> #include <vector> #include <set> using namespace std; const int inf = (int)1e9 + 7; vector<int> x[2005], y[2005]; set<pair<int, int>> dist; void init(int n) { for (int i = 1; i <= n; i++) { x[i].clear(); y[i].clear(); dist.insert({i, i}); } } bool sameSet(int u, int v) { return dist.find({u, v}) != dist.end(); } void merge(int u, int v) { if (!sameSet(u, v)) { dist.erase({min(u, v), max(u, v)}); dist.insert({u, v}); } } void dfs(int node, int start, vector<vector<int>>& dp) { dp[node][start] = min(dp[node][start], abs(x[node][start] - x[start][start]) + abs(y[node][start] - y[start][start])); for (auto &p : {x[node], y[node]}) { for (int i = 0; i < p.size(); ++i) { if (i == start || !sameSet(p[i], start)) continue; dfs(node, i, dp); merge(p[i], start); } } } int main() { int n; cin >> n; init(n); for (int i = 1; i <= n; i++) { for (int j = 0; j < 2; j++) { cin >> x[i][j]; for (int k = 1; k < n; k++) { y[k + i][j] = x[i][j]; } } } int m; cin >> m; vector<vector<int>> dp(n + 1, vector<int>(n + 1, inf)); while (m--) { int a, b; cin >> a >> b; if (!sameSet(a, b)) { merge(a, b); } dfs(a, b, dp); } cout << *dist.begin() << endl; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值