为什么我在 dp 的同时减 b,跟先算出结果再减 b 差了 30 分?
源代码(70分)
#include <bits/stdc++.h>
using namespace std;
int n,a[1003],b[1003],c[1003],dp[1003][1003][3];
int f(int x,int y){
if(x==y)
return 1;
if(x>y && (x!=2 || y!=0) || x==0 && y==2)
return 2;
return 0;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<n;i++)
cin>>b[i];
for(int i=1;i<=n;i++)
cin>>c[i];
for(int i=1;i<=n;i++)
for(int j=0;j<i;j++)
for(int k=0;k<3;k++)
if(j==0)
dp[i][j][k]=dp[i-1][j][k]+f(k,c[i])*a[i];
else
for(int q=0;q<3;q++)
if(k==q)
dp[i][j][k]=max(dp[i][j][k],dp[i-1][j][k]+f(k,c[i])*a[i]);
else
dp[i][j][k]=max(dp[i][j][k],dp[i-1][j-1][q]+f(k,c[i])*a[i]-b[j]);
int ans=-100;
for(int i=0;i<n;i++)
for(int j=0;j<3;j++)
ans=max(ans,dp[n][i][j]);
cout<<ans;
return 0;
}
AC代码
#include <bits/stdc++.h>
using namespace std;
int n,a[1003],b[1003],c[1003],dp[1003][1003][3];
int f(int x,int y){
if(x==y)
return 1;
if(x>y && (x!=2 || y!=0) || x==0 && y==2)
return 2;
return 0;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<n;i++){
cin>>b[i];
b[i]+=b[i-1];//前缀和
}
for(int i=1;i<=n;i++)
cin>>c[i];
for(int i=1;i<=n;i++)
for(int j=0;j<i;j++)
for(int k=0;k<3;k++)
if(j==0)
dp[i][j][k]=dp[i-1][j][k]+f(k,c[i])*a[i];
else
for(int q=0;q<3;q++)
if(k==q)
dp[i][j][k]=max(dp[i][j][k],dp[i-1][j][k]+f(k,c[i])*a[i]);
else
dp[i][j][k]=max(dp[i][j][k],dp[i-1][j-1][q]+f(k,c[i])*a[i]);//这里不减b[j]了
int ans=-100;
for(int i=0;i<n;i++)
for(int j=0;j<3;j++)
ans=max(ans,dp[n][i][j]-b[i]);//减去前缀和
cout<<ans;
return 0;
}
为什么我在 dp 的同时减 b,跟先算出结果再减 b 差了 30 分?