【发布时间】:2020-05-29 05:37:11
【问题描述】:
问题来了-
给定大小为 n 的数组 B。您必须构造数组 A 使得 1
示例 B=[1,2,3] A 可以是 [1,2,1],[1,1,3],[1,2,3] 在所有这些情况下,成本都是 2,这是最大值.
约束 n
这是我的方法 - 当 A[i]=1 或 A[i]=B[i]
时成本最大所以我创建了大小为 [100002][2][102] 的 dp[idx][flag][curr],它计算直到索引 idx 的成本。 flag 将为 0 或 1,表示 A[i] 应分别为 1 或 B[i]。 curr 将是 A[i] 的值,具体取决于标志
这是我的代码
#include<bits/stdc++.h>
using namespace std;
#define boost ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
typedef long long int ll;
#define mod 1000000007
ll n;
ll dp[100002][2][101];
ll b[100005];
ll solve(ll idx,ll flag,ll curr)
{
if(idx>=n)
return 0;
ll s1=0;
if(dp[idx][flag][curr]!=-1)
return dp[idx][flag][curr];
if(idx==0)
{
int left=solve(idx+1,0,curr);
int right=solve(idx+1,1,curr);
return dp[idx][flag][curr]=max(left,right);
}
else
{
if(flag==0)
{
s1=abs(curr-1);
return dp[idx][flag][curr]=s1+max(solve(idx+1,0,1),solve(idx+1,1,1));
}
else
{
s1=abs(b[idx]-curr);
return dp[idx][flag][curr]=s1+max(solve(idx+1,0,b[idx]),solve(idx+1,1,b[idx]));
}
}
}
int main()
{
boost
ll t;
cin>>t;
while(t--)
{
cin>>n;
memset(dp,-1,sizeof(dp));
ll res=0;
for(int i=0;i<n;i++)
cin>>b[i];
ll s1=solve(0,0,1);//Starting from idx 0 flag 0 and value as 1
ll s2=solve(0,1,b[0]);//Starting from idx 0 flag 1 and value as B[0]
cout<<max(s1,s2)<<"\n";
}
}'
有没有办法减少 dp 的状态或任何其他自上而下的解决方案,因为如果 B[i] 的值很大,我的代码会失败
【问题讨论】:
-
请不要使用“竞争性”网站作为学习或教学资源,因为它们只会教给你真正的坏习惯,永远不会让你就业(或者任何人想用十-脚杆,真的)。获取a few good books,参加课程,至少学习 C++ 的基础知识,以及一些常见和标准的算法和数据结构。训练、实验、编程、学习。然后,您可以使用诸如培训资源之类的网站。
-
我只是在练习。我猜它对编码面试很有好处
-
此类网站(以及您在此处展示的)所提倡的风格的代码不适合编码面试。恰恰相反。这就是为什么你不应该使用这样的网站作为初学者来学习编程。
标签: c++ c++14 dynamic-programming