P2858 [USACO06FEB] Treats for the Cows G/S 题解

P2858

题意

给一个数组。每天把最左或者最右的东西卖掉,第 i i i个东西,第 d a y day day天卖出的价格是 a [ i ] ∗ d a y a[i]*day a[i]∗day。

记忆化搜索

cpp 复制代码
void dfs(int l,int r,int day,ll sum)
{
	if(v[l][r]>=sum)return;
	v[l][r]=sum;
	if(l>r)//这就是dp答案
	{
		ans=max(ans,sum);
		return;
	}
	if(l<=n)dfs(l+1,r,day+1,sum+a[l]*day);
	if(r>=1)dfs(l,r-1,day+1,sum+a[r]*day);
}

TLE 63

正解dp

通过写dfs,我们可以发现对于状态dp[i][j]他的下一个状态就是dp[i+1][j]dp[i][j-1]。那么我们可以从当前状态出发计算下一个状态的值。我们可以用 d p [ i ] [ j ] dp[i][j] dp[i][j]表示从 [ i , j ] [i,j] [i,j]这个状态为起点的最大值。根据搜索的代码,答案就是 d p [ i ] [ i − 1 ] dp[i][i-1] dp[i][i−1]。记得long long

代码

cpp 复制代码
#include<bits/stdc++.h>
#include<cstring>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#include<map>
#define ll long long
#define lhs printf("\n");
using namespace std;
const int N=1e5+10;
const int M=2024;
const int inf=0x3f3f3f3f;
ll a[N],n,dp[M][M],ans; //记得ll
int v[M][M];
void dfs(int l,int r,int day,ll sum)//记忆化
{
	if(v[l][r]>=sum)return;
	v[l][r]=sum;
	if(l>r)
	{
		ans=max(ans,sum);
		return;
	}
	if(l<=n)dfs(l+1,r,day+1,sum+a[l]*day);
	if(r>=1)dfs(l,r-1,day+1,sum+a[r]*day);
}
int main()
{
	scanf("%lld",&n); 
	for(int i=1;i<=n;i++)scanf("%lld",&a[i]);	
	for(int i=1;i<=n;i++)
	{
		for(int j=n;j>=i;j--)
		{
			int day=i-1+n-j+1;
			dp[i+1][j]=max(dp[i+1][j],dp[i][j]+a[i]*day);
			dp[i][j-1]=max(dp[i][j-1],dp[i][j]+a[j]*day);	
		}
	}
	for(int i=1;i<=n;i++)
	{
		ans=max(ans,dp[i][i-1]);
	}
	printf("%lld",ans);
	return 0;
}

AC记录

相关推荐
ZoeJoy8几秒前
算法筑基(六):分治算法——大事化小,小事化了
算法·排序算法·动态规划·哈希算法·图搜索算法
美式请加冰4 分钟前
BFS算法(下)
算法·宽度优先
少许极端4 分钟前
算法奇妙屋(三十七)-贪心算法学习之路4
学习·算法·贪心算法·田忌赛马
We་ct5 分钟前
LeetCode 373. 查找和最小的 K 对数字:题解+代码详解
前端·算法·leetcode·typescript·二分·
Ricky_Theseus8 分钟前
探索群体智慧:蚁群算法(ACO)从原理到实践——python实现
python·算法·机器学习
Rabitebla14 分钟前
排序算法专题(一):插入排序 & 希尔排序
数据结构·算法·排序算法
南境十里·墨染春水8 小时前
C++传记(面向对象)虚析构函数 纯虚函数 抽象类 final、override关键字
开发语言·c++·笔记·算法
2301_797172758 小时前
基于C++的游戏引擎开发
开发语言·c++·算法
有为少年9 小时前
告别“唯语料论”:用合成抽象数据为大模型开智
人工智能·深度学习·神经网络·算法·机器学习·大模型·预训练
比昨天多敲两行9 小时前
C++ 二叉搜索树
开发语言·c++·算法