意思就是,给你一个序列,找出按顺序先减后加之后能得到的最大值,俩种方法,一种贪心,一种dp。(我开始的思路是找波峰的值加一下,波谷的值减一下,如果不凑巧只有递增,或者只有递减,再加一个处理,结果动态规划更简单(捂脸))
#include#define fep(i,a,b) for(ll i=a;i<=b;i++) #define frp(i,a,b) for(ll i=a;i>=b;i--) typedef long long ll; using namespace std; const int INF = 0x3f3f3f3f; const int maxn=3e5+1; ll a[maxn],b[maxn]; void solve(){ ll n,q,mx=0,sum=0,pos=0,pos2=0,mi=INF,k=0; memset(a,0,sizeof(a)); cin>>n>>q; a[0]=0; fep(i,1,n){ cin>>a[i]; k=max(k,a[i]); if(a[i]>a[i-1]){ // printf("mi:%d mx=%d sum=%d up!n",mi,mx,sum); if(pos) sum-=mi,pos=0; mx=max(mx,a[i]); pos2=1,mi=INF; }else{ if(pos2) sum+=mx,pos2=0; //printf("mi:%d mx=%d sum=%d down.....n",mi,mx,sum); mi=min(mi,a[i]); pos=1,mx=0; } } if(!sum||mx==a[n]) sum+=mx; cout< >t; while(t--){ solve(); } }
#include#define fep(i,a,b) for(ll i=a;i<=b;i++) #define frp(i,a,b) for(ll i=a;i>=b;i--) typedef long long ll; using namespace std; const int INF = 0x3f3f3f3f; const int maxn=3e5+1; ll a[maxn],b[maxn],dp[maxn][2]; void solve(){ ll n,q,k=0; memset(dp,0,sizeof(dp)); cin>>n>>q; a[0]=0; fep(i,1,n){ cin>>a[i]; k=max(k,a[i]); dp[i][0]=max(dp[i-1][0],dp[i-1][1]+a[i]); dp[i][1]=max(dp[i-1][1],dp[i-1][0]-a[i]); } cout< >t; while(t--){ solve(); } }



