双塔问题

题目链接:双塔问题


随便dp一下即可。

dp[i][j]为前i个,并且第一列比第二列高j的第一列高度。

然后枚举放第一个或者第二个或者不放即可。


AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include
//#define int long long
using namespace std;
const int N=2e4+10;
int dp[110][N],n,a[N],base=1e4;
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++)	cin>>a[i];
	memset(dp,0xcf,sizeof dp); dp[0][base]=0;
	for(int i=1;i<=n;i++){
		for(int j=a[i];j<=2e4;j++)	dp[i][j]=max(dp[i][j],dp[i-1][j-a[i]]+a[i]);
		for(int j=0;j<=2e4-a[i];j++)	dp[i][j]=max(dp[i][j],dp[i-1][j+a[i]]);
		for(int j=0;j<=2e4;j++)	dp[i][j]=max(dp[i][j],dp[i-1][j]);
	}
	cout<<dp[n][base];
	return 0;
}

你可能感兴趣的:(动态规划)