HDOJ5115

news/2024/11/29 19:59:32/

最近作死的新开一个群每天一个a+b,群主是不是得坚持下来呢,感谢群巨的鼓励和支持,一起加油


区间DP:HDOJ5115

区间DP特点总结:

数据量小,n一般在100,200左右,因为一般需要三个循环,太大了循环不起来,会超时

一般dp【1】【n】为结果

dp【i】【j】的状态转移需要中间量k作为转移的中点,dp【i】【k】,dp【k】【j】为最优子结构


题意:n匹狼,每匹狼有自身的伤害值a【i】,会给相邻的两匹狼b【i】的助攻值,即如果想打死第二匹,需要花费a【2】+b【1】+b【3】

求打死n匹狼至少承担多少伤害?


典型区间dp,dp【1】【n】为最终答案

方法一般有两种:记忆化的DP和三重for循环的

个人推荐记忆化是因为不需要关注变量的循环顺序和大小,只要知道最优子结构如果推导下一层就可以

for循环也有好处:每个子区间肯定只会计算一次,记忆化会要迭代很多次,容易超时


在这个题中,dp【i】【j】的转移是:在区间【i,j】中,最后打死的是哪匹狼会获得最小的伤害

如果是最后打死i,那么花费是dp【i+1】【j】+a【i】+b【i-1】+b【j+1】

如果是最后打死j,那么花费是dp【i】【j-1】+a【j】+b【i-1】+b【j+1】

如果是最后打死k,i<k<j,那么花费是dp【i】【k-1】+dp【k+1】【j】+a【k】+b【i-1】+b【j+1】

取最小即可。细节点就是记得初始化


记忆化代码

int t,n;
int a[maxn];
int b[maxn];
int dp[maxn][maxn];int getdp(int i,int j){if (dp[i][j]!=-1) return dp[i][j];if (i==j) return dp[i][j]=a[i]+b[i-1]+b[i+1];int tmp1=getdp(i,j-1)+a[j]+b[i-1]+b[j+1];int tmp2=getdp(i+1,j)+a[i]+b[i-1]+b[j+1];int tmp,ans=min(tmp1,tmp2);for(int k=i+1;k<j;k++){tmp=getdp(i,k-1)+getdp(k+1,j)+a[k]+b[i-1]+b[j+1];ans=min(ans,tmp);}return dp[i][j]=ans;
}int main(){//input;scanf("%d",&t);for(int Case=1;Case<=t;Case++){scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&a[i]);for(int i=1;i<=n;i++) scanf("%d",&b[i]);memset(dp,-1,sizeof(dp));printf("Case #%d: %d\n",Case,getdp(1,n));}return 0;
}

for循环代码:

long long dp[maxn][maxn];
long long a[maxn];
long long b[maxn];
int n,t;void debug(){for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)printf("%I64d%c",dp[i][j],j==n?'\n':' ');
}int main(){//input;int i,j,k,len;scanf("%d",&t);for(int Case=1;Case<=t;Case++){scanf("%d",&n);memset(a,0,sizeof(a));memset(b,0,sizeof(b));for(i=1;i<=n;i++) scanf("%lld",&a[i]);for(i=1;i<=n;i++) scanf("%lld",&b[i]);for(i=1;i<=n;i++)for(j=i+1;j<=n;j++)dp[i][j]=INF;for(i=1;i<=n;i++)dp[i][i]=a[i]+b[i-1]+b[i+1];for(i=1;i<=n-1;i++)dp[i][i+1]=min(dp[i][i]+a[i+1]+b[i-1]+b[i+2],dp[i+1][i+1]+a[i]+b[i-1]+b[i+2]);//debug();for(i=n-2;i>=1;i--)for(len=3;len+i<=n+1;len++){j=i+len-1;//dp[i][j]=min(dp[i][j],dp[i+1][j]+a[i]+b[i-1]+b[j+1]);//dp[i][j]=min(dp[i][j],dp[i][j-1]+a[j]+b[i-1]+b[j+1]);for(k=i;k<=j;k++)dp[i][j]=min(dp[i][j],dp[i][k-1]+dp[k+1][j]+a[k]+b[i-1]+b[j+1]);}//debug();printf("Case #%d: %lld\n",Case,dp[1][n]);}return 0;
}

个人习惯:

i作为区间起点,然后枚举的是区间长度len,用起点和长度来计算终点j

然后枚举分隔地点k

之后的东西就一样了


http://www.ppmy.cn/news/112783.html

相关文章

docker都有那些工具,及工具面试题

docker介绍 Docker 是一种开源的容器化平台&#xff0c;可以帮助开发者将应用程序和依赖项打包到轻量级的容器中&#xff0c;然后部署到任何基于 Linux 的操作系统中。使用 Docker 可以大大简化开发、部署和管理应用程序的过程&#xff0c;使其更加快速、灵活和可靠。 Docker…

[导入]删除 www.5115.com 恶意网站

下载软件后&#xff0c;每次打开IE浏览器&#xff0c;都弹出www.5115.com这个垃圾网址网站。非常反感现在这些垃圾程序。 在C:\windows\system32下发现了 SystemDll.dll&#xff0c;SysDb.Dat&#xff0c;等几个可疑的东西&#xff0c;删掉。 反注册C:\windows\system32\NBBHO.…

HDU5115Dire Wolf(区间DP)

题目大意&#xff1a; 你是一个战士现在面对&#xff0c;一群狼&#xff0c;每只狼都有一定的主动攻击力和附带攻击力。你杀死一只狼。你会受到这只狼的&#xff08;主动攻击力旁边两只狼的附带攻击力&#xff09;这么多伤害~现在问你如何选择杀狼的顺序使的杀完所有狼时&…

Intel至强可扩展处理器 Skylake-SP(Purley 最新一代至强)购买指南

前言 Intel Purley平台&#xff0c;Skylake-SP&#xff0c;至强可扩展处理器&#xff08;铂金、黄金、白银、青铜&#xff09;发售了&#xff0c;共58颗处理器。 这些处理器里哪些值得购买&#xff1f;哪些是骗小白的&#xff1f;它们各自的定位如何&#xff1f;本文将帮助你…

【Servlet编程】使用Smart Tomcat插件运行Servlet程序

前言: 大家好,我是良辰丫,在上一篇文章中我们已经学习了部署我们的第一个Servlet程序,想必大家对各个步骤已经有了一定的了解和认识,那么能不能优化一下各个步骤呢?每次打包部署有点麻烦哦!那么今天我们就来学习一个idea的插件,可以帮助我们简化我们的部署操作!!!&#x1f49e…

MySQL数据库——MySQL优化服务器,提高MySQL的运行速度!

MySQL是一种广泛使用的关系型数据库管理系统&#xff0c;优化MySQL服务器可以显著提高数据库的性能和运行速度。在下面的回答中&#xff0c;我将介绍一些常见的MySQL优化策略和技术&#xff0c;以帮助提高MySQL服务器的性能。 1、优化数据库设计&#xff1a; 正确设计数据库结…

Ceph架构组件及存储过程

1、存储基础 //单机存储设备 ●DAS&#xff08;直接附加存储&#xff0c;是直接接到计算机的主板总线上去的存储&#xff09; IDE、SATA、SCSI、SAS、USB 接口的磁盘 所谓接口就是一种存储设备驱动下的磁盘设备&#xff0c;提供块级别的存储 ●NAS&#xff08;网络附加存储&am…

银行面试:如何有效应对答题?

从如信银行考试中心了解到&#xff0c;面试之间都有共性&#xff0c;其考查的核心都是一致的&#xff0c;真正洞悉HR想知道的信息&#xff0c;才能有效的应对回答。因此同学们在前期准备的时候&#xff0c;有哪些要特别注意答题技巧呢&#xff1f; 1、把握重点&#xff0c;简洁…