T1:
Alice 和 Bob 有一個長度爲2n的數。現在他們要在這個數字上玩遊戲。他們分別要從 2n 個位中取出 n 個位組成自己的幸運值。每一回合,Alice 或 Bob 把數字最左邊的那一位拿來放在自己幸運值
的最末位。在第 i 輪操作過後,被選取的數位(原數的第i位)會從原數中消失。現在 Alice 和 Bob 想要使得他們兩個幸運值的和儘可能大。請求出這個值。
自己想的選數:
每次在可選的範圍內選擇最大的數
#include<bits/stdc++.h>
using namespace std;
int a[50],n,w=0,pos,tot;
bool ex[50];
long long ans=0;
inline void work(){
ans=ans*10;
++w;
for(int i=1;i<=n*2;++i){
if(ex[i]==false){
ans+=a[i];
ex[i]=true;
break;
}
}
int maxn=-1;
for(int i=1;i<=n*2;++i){
if(2*n-i>=n-w&&i>=pos){
if(ex[i]==false&&a[i]>maxn)
maxn=a[i];
}
}
for(int i=1;i<=n*2;++i){
if(2*n-i>=n-w&&i>=pos){
if(a[i]==maxn&&ex[i]==false){
ex[i]=true;
ans+=a[i];
pos=i;
break;
}
}
}
if(w==n) return;
work();
}
int main(){
// freopen("hello.in","r",stdin);
// freopen("hello.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=2*n;++i) scanf("%1d",&a[i]);
work();
cout<<ans;
return 0;
}
標算:
動態規劃 f[i][j]:當前位置選擇i個數到第一個數中,選擇i個數到第二個數中,f[i][j]=兩數之和。
#include<bits/stdc++.h>
using namespace std;
int n;
int a[50];
long long f[20][20],s[50];
int main(){
scanf("%d",&n);
for(int i=1;i<=2*n;++i) scanf("%1d",&a[i]);
s[n]=1;
for(int i=n-1;i>=1;--i) s[i]=s[i+1]*10;
for(int i=1;i<=n;++i) f[i][0]=f[i-1][0]+a[i]*s[i],f[0][i]=f[i][0];
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
f[i][j]=max(f[i-1][j]+a[i+j]*s[i],f[i][j-1]+a[i+j]*s[j]);
cout<<f[n][n];
return 0;
}