【POJ 3666】Making the Grade(简单DP)

2024-09-07 23:32
文章标签 简单 dp poj grade making 3666

本文主要是介绍【POJ 3666】Making the Grade(简单DP),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先可以明确一个方面,那就是如果将X改成Y,那么Y肯定是这N个数中的某一个(为什么仔细想想)

之后可以得到一个状态转移那就是dp[i][j]代表已经考虑了i位的情况下,结尾为j的最小更改数。

状态转移为dp[i][j] = min(dp[i-1][k] + abs(a[i] - b[j])) 这样的话可以写出一个初步的代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int  INF = 1 << 30;
const int maxn = 2005;
int arr[maxn];
int Hash[maxn],cnt;
int dp[maxn][maxn];
int n;
void Hash_init(){sort(Hash,Hash + cnt);cnt = unique(Hash,Hash + cnt) - Hash;//printf("%d\n",cnt);
}
void solve(){dp[0][0] = 0;for(int i = 1; i < n; i++){for(int j = 0; j < cnt; j++){dp[i][j] = INF;for(int k = 0; k <= j; k++){dp[i][j] = min(dp[i][j],dp[i - 1][k] + abs(Hash[j] - arr[i]));}}}int ans = dp[n - 1][0];for(int i = 1; i < cnt; i++)ans = min(ans,dp[n - 1][i]);printf("%d\n",ans);
}
int main(){while(scanf("%d",&n) != EOF){cnt = 0;for(int i = 0; i < n; i++){scanf("%d",&arr[i]);Hash[cnt++] = arr[i];}Hash_init();solve();}return 0;
}


继续看,这里3个for循环对于上千的数据肯定是不行的,既然这样我们优化,首先我们可以知道每次取min(dp[i - 1][t])就可以,这里t <= j,这里我们用一个数组pre[]来代表这个结果,这样直接去了一层循环,pre[t]每次循环需要更新


#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int  INF = 1 << 30;
const int maxn = 2005;
int arr[maxn],pre[maxn];
int Hash[maxn],cnt;
int dp[maxn][maxn];
int n;
void Hash_init(){sort(Hash,Hash + cnt);cnt = unique(Hash,Hash + cnt) - Hash;
}
void solve(){dp[0][0] = 1;for(int i = 1; i < n; i++){for(int j = 0; j < cnt; j++){dp[i][j] = pre[j] + abs(Hash[j] - arr[i]);if(!j)pre[j] = dp[i][j];elsepre[j] = min(pre[j - 1],dp[i][j]);}}int ans = dp[n - 1][0];for(int i = 1; i < cnt; i++)ans = min(ans,dp[n - 1][i]);printf("%d\n",ans);
}
int main(){while(scanf("%d",&n) != EOF){cnt = 0;for(int i = 0; i < n; i++){scanf("%d",&arr[i]);Hash[cnt++] = arr[i];}Hash_init();solve();}return 0;
}


这样已经可以AC了,但是我们还可以利用滚动数组去优化空间

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 2005;
int arr[maxn],pre[maxn];
int Hash[maxn],cnt;
int dp[2][maxn];
int n;
void Hash_init(){sort(Hash,Hash + cnt);cnt = unique(Hash,Hash + cnt) - Hash;
}
void solve(){dp[0][0] = 1;int k = 0;for(int i = 1; i < n; i++){for(int j = 0; j < cnt; j++){dp[k][j] = pre[j] + abs(Hash[j] - arr[i]);if(!j)pre[j] = dp[k][j];elsepre[j] = min(pre[j - 1],dp[k][j]);}k ^= 1;}k ^= 1;int ans = dp[k][0];for(int i = 1; i < cnt; i++)ans = min(ans,dp[k][i]);printf("%d\n",ans);
}
int main(){while(scanf("%d",&n) != EOF){cnt = 0;for(int i = 0; i < n; i++){scanf("%d",&arr[i]);Hash[cnt++] = arr[i];}Hash_init();solve();}return 0;
}
恩,就是这样~

这篇关于【POJ 3666】Making the Grade(简单DP)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1146478

相关文章

Python中Request的安装以及简单的使用方法图文教程

《Python中Request的安装以及简单的使用方法图文教程》python里的request库经常被用于进行网络爬虫,想要学习网络爬虫的同学必须得安装request这个第三方库,:本文主要介绍P... 目录1.Requests 安装cmd 窗口安装为pycharm安装在pycharm设置中为项目安装req

SpringBoot简单整合ElasticSearch实践

《SpringBoot简单整合ElasticSearch实践》Elasticsearch支持结构化和非结构化数据检索,通过索引创建和倒排索引文档,提高搜索效率,它基于Lucene封装,分为索引库、类型... 目录一:ElasticSearch支持对结构化和非结构化的数据进行检索二:ES的核心概念Index:

GO语言实现串口简单通讯

《GO语言实现串口简单通讯》本文分享了使用Go语言进行串口通讯的实践过程,详细介绍了串口配置、数据发送与接收的代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录背景串口通讯代码代码块分解解析完整代码运行结果背景最近再学习 go 语言,在某宝用5块钱买了个

SpringBoot整合Apache Spark实现一个简单的数据分析功能

《SpringBoot整合ApacheSpark实现一个简单的数据分析功能》ApacheSpark是一个开源的大数据处理框架,它提供了丰富的功能和API,用于分布式数据处理、数据分析和机器学习等任务... 目录第一步、添加android依赖第二步、编写配置类第三步、编写控制类启动项目并测试总结ApacheS

C++简单日志系统实现代码示例

《C++简单日志系统实现代码示例》日志系统是成熟软件中的一个重要组成部分,其记录软件的使用和运行行为,方便事后进行故障分析、数据统计等,:本文主要介绍C++简单日志系统实现的相关资料,文中通过代码... 目录前言Util.hppLevel.hppLogMsg.hppFormat.hppSink.hppBuf

Python实现简单封装网络请求的示例详解

《Python实现简单封装网络请求的示例详解》这篇文章主要为大家详细介绍了Python实现简单封装网络请求的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录安装依赖核心功能说明1. 类与方法概览2.NetHelper类初始化参数3.ApiResponse类属性与方法使用实

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

python连接sqlite3简单用法完整例子

《python连接sqlite3简单用法完整例子》SQLite3是一个内置的Python模块,可以通过Python的标准库轻松地使用,无需进行额外安装和配置,:本文主要介绍python连接sqli... 目录1. 连接到数据库2. 创建游标对象3. 创建表4. 插入数据5. 查询数据6. 更新数据7. 删除

Jenkins的安装与简单配置过程

《Jenkins的安装与简单配置过程》本文简述Jenkins在CentOS7.3上安装流程,包括Java环境配置、RPM包安装、修改JENKINS_HOME路径及权限、启动服务、插件安装与系统管理设置... 目录www.chinasem.cnJenkins安装访问并配置JenkinsJenkins配置邮件通知

Python yield与yield from的简单使用方式

《Pythonyield与yieldfrom的简单使用方式》生成器通过yield定义,可在处理I/O时暂停执行并返回部分结果,待其他任务完成后继续,yieldfrom用于将一个生成器的值传递给另一... 目录python yield与yield from的使用代码结构总结Python yield与yield