AT_joisc2015_i
先将暴力转移方程列出来:设
容易发现,两种转移的目标装态的
对于处理最后
code:
点击查看代码
int n,m,a[N],b[N],c[N],dp[N][N][N][2];
void Yorushika(){
scanf("%d",&n);
rep(i,1,n){
scanf("%d%d%d",&a[i],&b[i],&c[i]);
}
n++,a[n]=b[n]=c[n]=0;
n++,a[n]=b[n]=c[n]=0;
mems(dp,-0x3f);
dp[2][3][1][0]=c[1];
dp[1][2][3][1]=c[3];
int ans=0;
rep(i,1,n){
rep(j,1,n){
rep(l,1,n){
if(dp[i][j][l][0]>-1e9){
int k=j+1;
if(a[i]==a[l]||b[i]==b[l]||!a[i])
dp[j][k][i][0]=max(dp[j][k][i][0],dp[i][j][l][0]+c[i]);
if(a[k]==a[l]||b[k]==b[l]||!a[k])
dp[i][j][k][1]=max(dp[i][j][k][1],dp[i][j][l][0]+c[k]);
ans=max(ans,dp[i][j][l][0]);
}
if(dp[i][j][l][1]>-1e9){
int k=l+1;
if(a[i]==a[l]||b[i]==b[l]||!a[i])
dp[j][k][i][0]=max(dp[j][k][i][0],dp[i][j][l][1]+c[i]);
if(a[k]==a[l]||b[k]==b[l]||!a[k])
dp[i][j][k][1]=max(dp[i][j][k][1],dp[i][j][l][1]+c[k]);
ans=max(ans,dp[i][j][l][1]);
}
}
}
}
printf("%d\n",ans);
}
signed main(){
int t=1;
// scanf("%d",&t);
while(t--)
Yorushika();
}