杭电ACM-LCY算法进阶培训班-专题训练10
1015 Two Rabbits
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
#define re register int
#define eps 1e-8
#define ls(p) p<<1
#define rs(p) p<<1|1
#define pi acos(-1.0)
#define pb push_back
#define mk make_pair
#define P pair < int , int >
using namespace std;
const int mod=1e9+7;
const int M=1e8;
const int N=4e3+5;
int n;
int f[N][N],a[N];
void solve()
{
while(cin>>n&&n)
{
int ans=0;
for(re i=1;i<=n;i++) scanf("%d",&a[i]),a[n+i]=a[i];
for(re i=0;i<N;i++) for(re j=0;j<N;j++) f[i][j]=0;
for(re i=1;i<=n*2;i++) f[i][i]=1;
for(re len=2;len<=2*n;len++) for(re l=1;l<=2*n;l++)
{
int r=len+l-1;
if(r>2*n) break;
if(a[l]==a[r]) f[l][r]=f[l+1][r-1]+2;
f[l][r]=max(f[l][r],max(f[l][r-1],f[l+1][r]));
}
for(re i=1;i<=2*n;i++) ans=max(ans,max(f[i][i+n-1],f[i][i+n]-1));
printf("%d\n",ans);
}
}
signed main()
{
int T=1;
for(int index=1;index<=T;index++)
{
solve();
}
return 0;
}
1016 Dire Wolf
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
#define re register int
#define eps 1e-8
#define ls(p) p<<1
#define rs(p) p<<1|1
#define pi acos(-1.0)
#define pb push_back
#define mk make_pair
#define P pair < int , int >
using namespace std;
const int mod=1e9+7;
const int M=1e8;
const int N=4e3+5;
int n;
int f[N][N],a[N],b[N];
void solve()
{
cin>>n;
int ans=0;
for(re i=1;i<=n;i++) scanf("%d",&a[i]);
for(re i=1;i<=n;i++) scanf("%d",&b[i]);
b[n+1]=0;
for(re i=0;i<N;i++) for(re j=0;j<N;j++) f[i][j]=0;
for(re i=1;i<=n;i++) for(re j=i;j<=n;j++) f[i][j]=1e9;
for(re len=1;len<=n;len++) for(re l=1;l<=n;l++)
{
int r=l+len-1;
if(r>n) break;
for(re k=l;k<=r;k++) f[l][r]=min(f[l][r],f[l][k-1]+a[k]+f[k+1][r]+b[l-1]+b[r+1]);
}
cout<<f[1][n]<<endl;
}
signed main()
{
int T=1;
cin>>T;
for(int index=1;index<=T;index++)
{
printf("Case #%d: ",index);
solve();
}
return 0;
}
1017 String painter
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
#define re register int
#define eps 1e-8
#define ls(p) p<<1
#define rs(p) p<<1|1
#define pi acos(-1.0)
#define pb push_back
#define mk make_pair
#define P pair < int , int >
using namespace std;
const int mod=1e9+7;
const int M=1e8;
const int N=4e2+5;
char a[N],b[N];
int f[N][N],dp[N];
void solve()
{
while(scanf("%s%s",a+1,b+1)!=EOF)
{
memset(f,0x3f,sizeof(f));
int n=strlen(a+1);
for(int i=0;i<=n;i++) f[i][i]=1;
for(int len=2;len<=n;len++)
for(int i=1;i<=n;i++)
{
int j=i+len-1;
if(j>n) break;
if(b[i]==b[j]) f[i][j]=min(f[i][j],f[i][j-1]);
else for(int k=i;k<j;k++) f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);
}
for(int i=1;i<=n;i++) dp[i]=f[1][i];
if(a[1]!=b[1]) dp[1]=1;
else dp[1]=0;
for(int i=2;i<=n;i++)if(b[i]==a[i]) dp[i]=dp[i-1];
else for(int j=1;j<i;j++) dp[i]=min(dp[i],dp[j]+f[j+1][i]);
printf("%d\n",dp[n]);
}
}
signed main()
{
int T=1;
for(int index=1;index<=T;index++)
{
solve();
}
return 0;
}
1018 You Are the One
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
#define re register int
#define eps 1e-8
#define ls(p) p<<1
#define rs(p) p<<1|1
#define pi acos(-1.0)
#define pb push_back
#define mk make_pair
#define P pair < int , int >
using namespace std;
const int mod=1e9+7;
const int M=1e8;
const int N=4e2+5;
int a[N],sum[N],f[N][N];
int n;
void solve()
{
cin>>n;
for(re i=1;i<=n;i++) scanf("%d",&a[i]);
for(re i=1;i<=n;i++) sum[i]=sum[i-1]+a[i];
for(re i=0;i<N;i++) for(re j=0;j<N;j++) f[i][j]=0;
for(re i=1;i<=n;i++) for(re j=i+1;j<=n;j++) f[i][j]=1e9;
for(re l=n-1;l>=1;l--) for(re r=l+1;r<=n;r++) for(re k=l;k<=r;k++) f[l][r]=min(f[l][r],f[l+1][k]+f[k+1][r]+(k-l+1)*(sum[r]-sum[k])+a[l]*(k-l));
cout<<f[1][n]<<endl;
}
signed main()
{
int T=1;
cin>>T;
for(int index=1;index<=T;index++)
{
printf("Case #%d: ",index);
solve();
}
return 0;
}