参考:https://blog.csdn.net/mobius_strip/article/details/40264311
题目大意:
有两个串,分别为A,B。我们最终要找到B中的子串求和,这个子串必须在A中是递增的,同时这个子串和必须是最大的。
和我们做过的最长递增子串参不多,只不过我们需要把dp表换一下,这次的dp表存放的是,A递增串中最大的求和值(和的元素来源于B就是了)。
AC代码:
#include <bits/stdc++.h>
using namespace std;
int main(){
int N;
cin>>N;
for(int i= 0;i<N;i++){
int leng;
cin>>leng;
vector<int> wid;
vector<int> hei;
for(int j=0;j<leng;j++){
int t;
cin>>t;
hei.push_back(t);
}
for(int j =0;j<leng;j++){
int t;
cin>>t;
wid.push_back(t);
}
vector<int> dpi(leng);
vector<int> dpd(leng);
int inm = -1;
int dem = -1;
for(int ii =0;ii<leng;ii++){
dpi[ii] = dpd[ii] = wid[ii];
int maxdpi = 0;
int maxdpid = 0;
for(int jj=0;jj<ii;jj++){
if(hei[jj]<hei[ii]){
maxdpi = max(maxdpi,dpi[jj]);
}
if(hei[jj]> hei[ii]){
maxdpid = max(maxdpid,dpd[jj]);
}
}
dpi[ii]+=maxdpi;
dpd[ii]+=maxdpid;
inm = max(inm,dpi[ii]);
dem = max(dem,dpd[ii]);
}
if(inm>=dem){
printf("Case %d. Increasing (%d). Decreasing (%d).\n",i+1,inm,dem);
}else printf("Case %d. Decreasing (%d). Increasing (%d).\n",i+1,dem,inm);
}
return 0;
}