zoukankan      html  css  js  c++  java
  • 删数 记忆化搜索

    题目描述

    有N个不同的正整数数x1, x2, ... xN 排成一排,我们可以从左边或右边去掉连续的i(1≤i≤n)个数(只能从两边删除数),剩下N-i个数,再把剩下的数按以上操作处理,直到所有的数都被删除为止。

    每次操作都有一个操作价值,比如现在要删除从i位置到k位置上的所有的数。操作价值为|xi – xk|*(k-i+1),如果只去掉一个数,操作价值为这个数的值。 问如何操作可以得到最大值,求操作的最大价值。

    输入输出格式

    输入格式:

    第一行为一个正整数N;

    第二行有N个用空格隔开的N个不同的正整数。

    输出格式:

    一行,包含一个正整数,为操作的最大值

    输入输出样例

    输入样例#1: 复制
    6
    54 29 196 21 133 118
    
    输出样例#1: 复制
    768

    说明

    【样例说明】

    说明,经过3 次操作可以得到最大值,第一次去掉前面3个数54、29、196,操作价值为426。第二次操作是在剩下的三个数(21 133 118)中去掉最后一个数118,操作价值为118。第三次操作去掉剩下的2个数21和133 ,操作价值为224。操作总价值为426+118+224=768。

    【数据规模】

    3≤N≤100,N个操作数为1..1000 之间的整数。

    #include<bits/stdc++.h>
    using namespace std;
    
    #define maxn 200005
    int a[maxn];
    int n; 
    int dp[200][200];
    int maxx=999999999;
    int res;
    int dfs(int x,int y){
    	if(dp[x][y])return dp[x][y];
    	for(int i=x;i<=y;i++){
    		if(i<y)res=dfs(x,i)+dfs(i+1,y);
    		else res=abs(a[x]-a[y])*(y-x+1);
    		dp[x][y]=max(dp[x][y],res);
    	}
    	return dp[x][y];
    }
    
    main(){
        ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
        cin>>n;
        for(int i=1;i<=n;i++)cin>>a[i];
        for(int i=1;i<=n;i++){
        	dp[i][i]=a[i];
        	if(i>1)dp[i-1][i]=abs(a[i]-a[i-1])*2;
    	}
    	dfs(1,n);
    	cout<<dp[1][n]<<endl;
    }
    
    EPFL - Fighting
  • 相关阅读:
    HTB-靶机-Charon
    第一篇Active Directory疑难解答概述(1)
    Outlook Web App 客户端超时设置
    【Troubleshooting Case】Exchange Server 组件状态应用排错?
    【Troubleshooting Case】Unable to delete Exchange database?
    Exchange Server 2007的即将生命周期,您的计划是?
    "the hypervisor is not running" 故障
    Exchange 2016 体系结构
    USB PE
    10 months then free? 10个月,然后自由
  • 原文地址:https://www.cnblogs.com/zxyqzy/p/10297461.html
Copyright © 2011-2022 走看看