家人们谁懂啊!
查看原帖
家人们谁懂啊!
907368
andycode楼主2024/8/22 11:22

为什么我在 dp 的同时减 b,跟先算出结果再减 b 差了 3030 分?

源代码(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 差了 3030 分?

2024/8/22 11:22
加载中...