计蒜客—逃生

代码:四次dp显得代码有点多,可以用向量一次解决,需要点技巧。代码核心思路可以看看,不是太好

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
ll n,m,x,y,v,c;
ll a[1005][1005],mark[1005][1005],dp[1005][1005];
ll mx=0,flag=0;
int deal1(ll zx,ll zy){
	for(int j=1;j<=y;j++)mark[x+1][j]=-1;
	for(int i=1;i<=x;i++)mark[i][y+1]=-1;
	for(int i=x;i>=1;i--)
	  for(int j=y;j>=1;j--){
	  	 ll temp1=0,temp2=0;
	    if(i==x&j==y){
		    dp[x][y]=(v>c)?c:v;continue;
		 }
	     if(mark[i+1][j]==-1&&mark[i][j+1]==-1){
	     	 mark[i][j]=-1;
	     	 continue;
		 }
	     if(!mark[i+1][j])temp1=dp[i+1][j]+a[i][j];
		 if(!mark[i][j+1])temp2=dp[i][j+1]+a[i][j];
		 if(max(temp1,temp2)>c)dp[i][j]=c;
		 else if(max(temp1,temp2)<=0)mark[i][j]=-1;
		 else dp[i][j]=max(temp1,temp2);
	  }
	  if(mark[zx][zy]==-1)return 0;
	  else {
	  	flag=1;
	  	return dp[zx][zy];
	  }
}
int deal2(ll zx,ll zy){
	for(int j=1;j<=y;j++)mark[x-1][j]=-1;
	for(int i=x;i<=n;i++)mark[i][y+1]=-1;
	for(int i=x;i<=n;i++)
	  for(int j=y;j>=1;j--){
	  	 ll temp1=0,temp2=0;
	     if(i==x&j==y){
		    dp[x][y]=v>c?c:v;continue;
		 }
	     if(mark[i-1][j]==-1&&mark[i][j+1]==-1){
	     	 mark[i][j]=-1;
	     	 continue;
		 }
	     if(!mark[i-1][j])temp1=dp[i-1][j]+a[i][j];
		 if(!mark[i][j+1])temp2=dp[i][j+1]+a[i][j];
		 if(max(temp1,temp2)>c)dp[i][j]=c;
		 else if(max(temp1,temp2)<=0)mark[i][j]=-1;
		 else dp[i][j]=max(temp1,temp2);
	  }
	  if(mark[zx][zy]==-1)return 0;
	  else {
	  	flag=1;
	  	return dp[zx][zy];
	  }
}
int deal3(ll zx,ll zy){
	for(int j=y;j<=m;j++)mark[x+1][j]=-1;
	for(int i=1;i<=x;i++)mark[i][y-1]=-1;
	for(int i=x;i>=1;i--)
	  for(int j=y;j<=m;j++){
	  	 ll temp1=0,temp2=0;
	     if(i==x&j==y){
		    dp[x][y]=v>c?c:v;continue;
		 }
	     if(mark[i+1][j]==-1&&mark[i][j-1]==-1){
	     	 mark[i][j]=-1;
	     	 continue;
		 }
	     if(!mark[i+1][j])temp1=dp[i+1][j]+a[i][j];
		 if(!mark[i][j-1])temp2=dp[i][j-1]+a[i][j];
		 if(max(temp1,temp2)>c)dp[i][j]=c;
		 else if(max(temp1,temp2)<=0)mark[i][j]=-1;
		 else dp[i][j]=max(temp1,temp2);
	  }
	  if(mark[zx][zy]==-1)return 0;
	  else {
	  	flag=1;
	  	return dp[zx][zy];
	  }
}
int deal4(ll zx,ll zy){
	for(int j=y;j<=m;j++)mark[x-1][j]=-1;
	for(int i=x;i<=n;i++)mark[i][y-1]=-1;
	for(int i=x;i<=n;i++)
	  for(int j=y;j<=m;j++){
	  	 ll temp1=0,temp2=0;
	     if(i==x&j==y){
		    dp[x][y]=v>c?c:v;continue;
		 }
	     if(mark[i-1][j]==-1&&mark[i][j-1]==-1){
	     	 mark[i][j]=-1;
	     	 continue;
		 }
	     if(!mark[i-1][j])temp1=dp[i-1][j]+a[i][j];
		 if(!mark[i][j-1])temp2=dp[i][j-1]+a[i][j];
		 if(max(temp1,temp2)>c)dp[i][j]=c;
		 else if(max(temp1,temp2)<=0)mark[i][j]=-1;
		 else dp[i][j]=max(temp1,temp2);
	  }
	  if(mark[zx][zy]==-1)return 0;
	  else {
	  	flag=1;
	  	return dp[zx][zy];
	  }
}
int main(){
	cin>>n>>m>>x>>y>>v>>c;
	for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++){
	  	   cin>>a[i][j];
	  }
     for(int i=1;i<=4;i++){
     	ll re;
     	memset(mark,0,sizeof(mark));
     	memset(dp,0,sizeof(dp));
     	if(i==1)re=deal1(1,1);
     	else if(i==2)re=deal2(n,1);
     	else if(i==3)re=deal3(1,m);
     	else re=deal4(n,m);
     	if(mx<re)mx=re;
	 }
	 if(flag)cout<<mx<<endl;
	 else cout<<-1<<endl; 
	 return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《VMware vSAN 超融合技术规划与部署》课程共分为“上集”和“下集”两部分,本套视频为“下集”部分,接续“上集”知识,是vSAN技术进阶推荐课程。  《VMware vSAN 超融合技术规划与部署》“下集”部分具体课程章节如下。  第1章 《使用延伸群集将数据存储扩展到两个站点》主要内容本章主要讲解了vSAN延伸群集的相关理论及构建vSAN延伸群集的方法。通过本章学习,您可以掌握延伸群集的设计注意事项和推荐做法;掌握使用快速入门功能配置延伸群集的方法;掌握手动配置延伸群集的方法;掌握将延伸群集更改为标准群集的方法。  第2章 《vSAN延伸群集策略》主要内容本章主要讲解了vSAN延伸群集中的虚拟机存储策略。通过本章学习,您可以理解允许的故障数主要级别 (PFTT)含意;理解允许的故障数辅助级别 (SFTT)含意;通过试验进一步理解PFTT和SFTT含意;掌握将VM放置在首xuan站点和辅助站点操作过程。  第3章 《管理 vSAN 群集中的故障域》主要内容本章主要讲解了vSAN群集中的故障域相关理论和实践知识。通过本章学习,您可以了解故障域的设计思想;掌握在 vSAN 群集中创建新的故障域的操作方法;掌握将主机移出故障域的操作方法;掌握将主机移至选定的故障域的操作方法;掌握重命名故障域的操作方法;掌握移除选定的故障域的操作方法。  第4章 《管理 vSAN 群集》主要内容本章主要讲解了管理vSAN群集相关知识。通过本章学习,您可以理解什么是维护模式;掌握使用维护模式的操作方法;掌握将混合 vSAN 群集迁移到全闪存群集操作方法;掌握关闭 vSAN 群集电源的方法。  第5章 《使用 vSAN iSCSI 目标服务》主要内容本章主要讲解了在vSAN环境中配置iSCSI目标服务,以把vSAN数据存储提供给外部用户使用。通过本章学习,您可以掌握vSAN iSCSI 目标服务的设计思想;学会创建vSAN iSCSI 目标服务;学会使用客户端连接vSAN iSCSI 目标服务;掌握vSAN iSCSI 目标服务的使用方法。  第6章 《vSAN 群集中的设备管理》主要内容本章主要讲解了vSAN 群集中的设备(缓存盘和容量盘)管理。通过本章学习,您可以学会将设备添加到磁盘组的操作方法;学会从 vSAN 移除磁盘组或设备的操作方法;学会重新创建磁盘组的操作方法;学会使用定位符 LED的操作方法;学会将设备标记为闪存的操作方法;学会将设备标记为 HDD的操作方法;学会添加容量设备的操作方法;学会从设备移除分区的操作方法。  第7章 《提高 vSAN 群集中的空间效率》主要内容本章主要讲解了提高 vSAN 群集中的空间效率相关知识。通过本章学习,您可以了解vSAN 空间效率理论知识;掌握使用去重和压缩的操作方法;了解RAID 5 或 RAID 6 删除编码;了解RAID 5 或 RAID 6 设计注意事项。  第8章 《vSAN监控》主要内容本章主要讲解了vSAN监控相关知识。通过本章学习,您可以掌握监控 vSAN 群集的操作方法;掌握监控 vSAN 运行状况的操作方法;掌握监控 vSAN 性能的操作方法。  VMware vSAN 6.7 超融合技术规划与部署(上集):https://edu.csdn.net/course/detail/35188VMware vSAN 6.7 超融合技术规划与部署(下集):https://edu.csdn.net/course/detail/35191

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值