hdu 5406CRB and Apple

本文介绍了一种利用离散化与树状数组优化动态规划算法的方法,通过实例详细解析了如何对输入数据进行预处理以减少状态数量,并采用树状数组高效更新和查询状态转移方程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//http://blog.youkuaiyun.com/keshuai19940722/article/details/47843837
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<string>
#include<stack>
#include<vector>
#include<queue>
#include<map>
#include<sstream>
using namespace std;
typedef long long LL;
inline void fre1()
{
    freopen("C:\\Users\\Administrator\\Desktop\\input.txt","r",stdin);/*freopen("output.txt","w",stdout);*/
}
inline void fre2()
{
    fclose(stdin);/*fclose(stdout);*/
}
#define lowbit(x) (x&-x)//取x二进制数最小的1
#define MS(x,y) memset(x,y,sizeof(x))
#define maxn 1000+50
#define maxm 50000+50
#define INF (int)(1e8+7)
#define PI acos(-1)
#define EPS 1e-7
#define mod (LL)1e9+7
int idx[maxn],num;
int dp[maxn][maxn];//dp[i][j]表示第一个子序列最后一位为第二个子序列最后一位为j的最大值
struct treepoint
{
    int h,val;
    bool operator<(const treepoint&t)const
    {
        return h==t.h?val<t.val:h>t.h;
    }
} k[maxn];
void add(int x,int d,int *c)
{
    while(x<maxn)
    {
        c[x]=max(c[x],d);
        x+=lowbit(x);
    }
}
int get(int x,int *c)
{
    int ans=0;
    while(x>0)
    {
        ans=max(ans,c[x]);
        x-=lowbit(x);
    }
    return ans;
}
int solve()
{
    int n,i,j;
    scanf("%d",&n);
    for(i=1; i<=n; ++i)
    {
        scanf("%d%d",&k[i].h,&k[i].val);
        idx[i]=k[i].val;
    }
    sort(idx+1,idx+n+1);
    sort(k+1,k+n+1);
    num=1;
    for(i=2; i<=n; ++i)if(idx[i]!=idx[num])idx[++num]=idx[i];
    for(i=1; i<=n; ++i)
    {
        k[i].val=lower_bound(idx+1,idx+num+1,k[i].val)-idx;
    }
    //到这里为止是将书上的果子进行排序,并将美味值进行离散化

    int ans=0,tmp[maxn];
    MS(dp,0);
    for(i=1; i<=n; ++i)//枚举每一个k[i].val,每次其实把dp[1~n][1~n]都更新了
    {                  //dp[v][i]=dp[i][v]=max(dp[i][1~v])+1;
        int v=k[i].val;
        for(j=1; j<=n; ++j)
        {
            tmp[j]=get(v,dp[j])+1;//这里的get(v,dp[j])将相当于max(dp[i][1~v])
            ans=max(ans,tmp[j]);
        }
        for(j=1; j<=n; ++j)
        {
            add(v,tmp[j],dp[j]);//新的tmp[j]放到树状数组里对树状数组进行维护
            add(j,tmp[j],dp[v]);//这一步就是dp[v][i]=dp[i][v]
        }
    }
    return ans;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int ans=solve();
        printf("%d\n",ans);
    }
    return 0;
}

基于数据挖掘的音乐推荐系统设计与实现 需要一个代码说明,不需要论文 采用python语言,django框架,mysql数据库开发 编程环境:pycharm,mysql8.0 系统分为前台+后台模式开发 网站前台: 用户注册, 登录 搜索音乐,音乐欣赏(可以在线进行播放) 用户登陆时选择相关感兴趣的音乐风格 音乐收藏 音乐推荐算法:(重点) 本课题需要大量用户行为(如播放记录、收藏列表)、音乐特征(如音频特征、歌曲元数据)等数据 (1)根据用户之间相似性或关联性,给一个用户推荐与其相似或有关联的其他用户所感兴趣的音乐; (2)根据音乐之间的相似性或关联性,给一个用户推荐与其感兴趣的音乐相似或有关联的其他音乐。 基于用户的推荐和基于物品的推荐 其中基于用户的推荐是基于用户的相似找出相似相似用户,然后向目标用户推荐其相似用户喜欢的东西(和你类似的人也喜欢**东西); 而基于物品的推荐是基于物品的相似找出相似的物品做推荐(喜欢该音乐的人还喜欢了**音乐); 管理员 管理员信息管理 注册用户管理,审核 音乐爬虫(爬虫方式爬取网站音乐数据) 音乐信息管理(上传歌曲MP3,以便前台播放) 音乐收藏管理 用户 用户资料修改 我的音乐收藏 完整前后端源码,部署后可正常运行! 环境说明 开发语言:python后端 python版本:3.7 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:pycharm
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值