uva10558(DP)

来源:互联网 发布:天下三铭尘父子知乎 编辑:程序博客网 时间:2024/05/16 11:11

英语渣题目都看不懂,还是参考了Titanium的博客,这篇博客写的非常详细:

http://www.cnblogs.com/scau20110726/archive/2012/10/04/2711436.html


AC代码:

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N = 105;int n,m;int A;int cut[N];int vis[N];int f[N][N],s[N][N] , d[N][N] , h[N][N] , g[N][N],path[N][N];int res[N];struct point {int x;int y;}p[N * N];void init() {for(int i = 1; i < m ; i++) {for (int j = 1 ; j < 100 ; j++) {h[j][i] = d[j][i] = 0;for(int k = cut[i] ; k < cut[i + 1] ; k++) {if(g[j][k]) {h[j][i] = 1;break;}}d[j][i] = d[j - 1][i] + h[j][i];}}for (int i = 1 ; i < 100 ; i++) {for (int j = i + 1 ; j <= 100 ;j++) {s[i][j] = 0;for (int k = 1 ; k < m ; k++) {if(d[j - 1][k] - d[i][k] + h[i][k])s[i][j]++;}}}return ;}int dp(int l, int k) {if(f[l][k] != -1)return f[l][k];if(l == 0) {return f[l][k] = s[k][100];}for (int i = k + 1 ; i < 100 ; i++) {if(100 - i - 1 >= l - 1) {int ans = dp(l - 1 , i);if(ans + s[k][i] > f[l][k]) {f[l][k] = ans + s[k][i];path[k][l] = i;}}}return f[l][k];}void print_path(int i , int j) {if(j <= 0)return ;int k = path[i][j];printf(" %d",k);print_path(k , j - 1);return ;}int main () {while(scanf("%d",&n) && n != -1) {memset(f , -1 , sizeof(f));memset(g , 0 , sizeof(g));for (int i = 0 ; i < n ; i++) {int a,b;scanf("%d%d",&a , &b);g[b][a] = 1;}scanf("%d",&m);for(int i = 1  ; i <= m ; i++) {scanf("%d",&cut[i]);}scanf("%d",&A);init();dp(A - 2, 1);printf("%d ",A);printf("1");print_path(1 , A - 2);printf(" 100\n");}}


0 0