state:
dp[i][j] - max difference of subsequnce i to j
the DAG here is (i+1, j), (i, j-1) -> (i, j)
this tells us the iteration order of states for j=1 to n-1, for i=0 to i+j
transtion:
dp[i][j]=max(dp[i][j], s[i][j]-dp[p][q]), i+1<=p<=j, i<=q<j
/* UVas */ /*****************************************************************************/ int n; int a[100]; int s[101]; int d[100][100]; int main(void) { while (cin>>n&&n) { for (int i=0; i<n; i++) { cin>>a[i]; s[i+1]=s[i]+a[i]; } memset(d, 0, sizeof(d)); for (int i=0; i<n; i++) { d[i][i]=a[i]; } for(int j=1; j<n; j++){ for(int i=0; i+j<n; i++){ int m=0; for(int k=i+1; k<=i+j; k++) { m=min(m, d[k][i+j]); } for(int k=i; k<i+j; k++) { m=min(m, d[i][k]); } d[i][i+j]=s[i+j+1]-s[i]-m; } } cout<<2*d[0][n-1]-s[n]<<endl; } return 0; } /*****************************************************************************/
No comments :
Post a Comment