将自己历史的AC共享
zoj3160 DP题
dp[i][j] = max(dp[i][k]+dp[k+1][j]) i<=k
//1768666 2009-02-21 17:42:40 Accepted 3160 C++ 70 904 green tea
#include <cstdio>
#include <algorithm>
using namespace std;
int flag[305][305], dp[305][305], a[305];
int main()
{
int n, m, i, j, k, x, y;
while ( scanf("%d%d", &n, &m) != EOF ) {
memset(flag, 0, sizeof(flag));
for ( i = 0; i < m; ++i ) {
scanf("%d%d", &x, &y);
flag[x][y] = flag[y][x] = 1;
}
for ( i = 0; i < n; ++i )
scanf("%d", &a[i]);
memset(dp, 0, sizeof(dp));
for ( i = 1; i < n; ++i )
for ( j = 0; i+j < n; ++j ) {
int u = i+j;
if ( dp[j+1][u-1] == u-j-1 && flag[a[j]][a[u]] )
dp[j][u] = u-j+1;
for ( k = j; k < u; ++k )
if ( dp[j][k] + dp[k+1][u] > dp[j][u] )
dp[j][u] = dp[j][k] + dp[k+1][u];
}
printf("%d\n", dp[0][n-1]);
}
return 0;
}
如觉得还有问题 可参考其他相关文章
zoj3160 其他1
zoj3160 其他2