Вот проблема -
Вам дан массив B размера n. Вы должны построить массив A так, чтобы 1 <= A [i] <= B [i] и сумма абсолютной разности последовательных пар A была максимизирована, то есть суммирование abs (A [i] -A [i -1]) максимизируется. Вы должны вернуть эту стоимость. </p>
Пример B = [1,2,3] A может быть [1,2,1], [1,1,3], [ 1,2,3] Во всех этих случаях стоимость равна 2, что является максимумом.
Ограничения n <= 10 ^ 5, 1 <= B [i] <= 100 </p>
Вот мой подход - Стоимость будет максимальной, когда A [i] = 1 или A [i] = B [i]
Итак, я создал dp [idx] [flag] [curr] размера [100002] [2 ] [102], где вычисляется стоимость до индекса 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] большие