相当经典的动归.
#include<stdio.h>
const int MAX=100001;
int f[MAX];
struct{
int z,y;
}arr[2*MAX];
int main(){
int N,n,i,j,max,num;
while(scanf("%d",&N)!=-1){
i=1;
while(i<=N){
scanf("%d",&f[i++]);
}
scanf("%d",&n);
i=0;
while(i<n){
scanf("%d %d",&arr[i].z,&arr[i].y);
i++;
}
num=0;
for(i=n-1;i>=0;){
max=0;
for(j=i;j>=0&&arr[j].z==arr[i].z;j--){
if(f[arr[j].y]>max)
max=f[arr[j].y];
}
f[arr[i].z]+=max;
if(f[arr[i].z]>num)
num=f[arr[i].z];
i=j;
}
printf("%d"n",num);
}
}
#include<stdio.h>
const int MAX=100001;
int f[MAX];
struct{
int z,y;
}arr[2*MAX];
int main(){
int N,n,i,j,max,num;
while(scanf("%d",&N)!=-1){
i=1;
while(i<=N){
scanf("%d",&f[i++]);
}
scanf("%d",&n);
i=0;
while(i<n){
scanf("%d %d",&arr[i].z,&arr[i].y);
i++;
}
num=0;
for(i=n-1;i>=0;){
max=0;
for(j=i;j>=0&&arr[j].z==arr[i].z;j--){
if(f[arr[j].y]>max)
max=f[arr[j].y];
}
f[arr[i].z]+=max;
if(f[arr[i].z]>num)
num=f[arr[i].z];
i=j;
}
printf("%d"n",num);
}
}

浙公网安备 33010602011771号