poj-3666
http://vjudge.net/problem/POJ-3666
题目是dp 题目; 简单dp 离散一下就好.
我们先来讲一讲不离散的,简单的懂了,其他的也很容易. dp[i] 代表这个数列以i 结尾的最小花费; 假设现在要求 前n个数组成的数列,那么dp[i]= 前 n-1 的 min(dp[i]~dp[0])+ (当前这个数-i);
#include <cstdio> #include <cstring> #include <cctype> #include <cmath> #include <set> #include <map> #include <list> #include <queue> #include <deque> #include <stack> #include <string> #include <vector> #include <iostream> #include <algorithm> #include <stdlib.h> #include <time.h> using namespace std; typedef long long LL; const int INF=0x3f3f3f3f; const int MOD=1e9+7; const int MAXSIZE=1e6+5; const double eps=0.0000000001; void fre() { freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); } #define memst(a,b) memset(a,b,sizeof(a)) #define fr(i,a,n) for(int i=a;i<n;i++) const int MAXN=2010; int a[MAXN],index[MAXN]; int dp[MAXN],temp[MAXN]; bool cmp(int x,int y) { return a[x]<a[y]; } int solve(int n) { for(int i=0;i<n;i++) temp[i]=abs(a[0]-a[index[i]]); for(int k=0;k<n-1;k++) { int minnum=INF; for(int i=0;i<n;i++) { minnum=min(minnum,temp[i]); dp[i]=abs(a[k+1]-a[index[i]])+minnum; } for(int i=0;i<n;i++) temp[i]=dp[i]; } int res=INF; for(int i=0;i<n;i++) res=min(res,dp[i]); return res; } int main(int argc,char *argv[]) { int n; while(scanf("%d",&n)+1) { for(int i=0;i<n;i++) scanf("%d",&a[i]),index[i]=i; sort(index,index+n,cmp); printf("%d\n",solve(n)); } return 0; } /**************************************************/ /** Copyright Notice **/ /** writer: wurong **/ /** school: nyist **/ /** blog : http://blog.csdn.net/wr_technology **/ /**************************************************/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次 .NET某固高运动卡测试 卡慢分析
· 微服务架构学习与思考:微服务拆分的原则
· 记一次 .NET某云HIS系统 CPU爆高分析
· 如果单表数据量大,只能考虑分库分表吗?
· 一文彻底搞懂 MCP:AI 大模型的标准化工具箱
· 7 个最近很火的开源项目「GitHub 热点速览」
· 博客园2025新款「AI繁忙」系列T恤上架
· DeepSeekV3:写代码很强了
· 记一次 .NET某固高运动卡测试 卡慢分析
· Visual Studio 2022 v17.13新版发布:强化稳定性和安全,助力 .NET 开发提