POJ-2004 简单DP..
2012-03-19 10:29
399 查看
简单的DP...并且在转移的时候标记转移的路径~~最后再输出最优路径就ok了...
Program:
Program:
#include<iostream> #include<stdio.h> #include<math.h> #include<string.h> #include<algorithm> #define PI 3.1415927 using namespace std; struct node { int l,dp,pre,data[26]; char s[22]; }a[10002]; bool cmp(node a,node b) { return a.l<b.l; } int i,j,k,n,ans,w[22]; char out[10002][22]; int main() { n=1; memset(a,0,sizeof(a)); while (~scanf("%s",a .s)) { a .l=strlen(a .s); a .dp=1; for (i=0;i<a .l;i++) a .data[a .s[i]-'a']++; n++; } n--; sort(a+1,a+1+n,cmp); memset(w,0,sizeof(w)); for (i=2;i<=n;i++) if (a[i].l!=a[i-1].l) w[a[i-1].l]=i-1; ans=1; for (i=1;i<=n;i++) if (w[a[i].l-1]) { for (j=w[a[i].l-1];a[j].l==a[i].l-1;j--) { for (k=0;k<26;k++) if (a[i].data[k]<a[j].data[k]) goto A; if (a[i].dp<a[j].dp+1) { a[i].dp=a[j].dp+1; a[i].pre=j; } A: ; } if (a[i].dp>a[ans].dp) ans=i; } n=0; i=ans; j=0; while (i) { strcpy(out[++j],a[i].s); i=a[i].pre; n++; } for (i=n;i>=1;i--) puts(out[i]); return 0; }
相关文章推荐
- poj 2193 Lenny's Lucky Lotto Lists 简单dp
- POJ 1260 简单dp问题 Pearls
- POJ 2342 简单树形dp
- POJ 3176 Cow Bowling (简单dp——数塔问题)
- POJ 1163 最佳路径简单DP
- POJ 3181 Dollar Dayz 简单DP
- POJ1651:Multiplication Puzzle(简单dp)题解
- POJ 1050 To the Max 最大子矩阵和 简单dp
- zoj 1074 || poj 1050 To the Max(简单DP)
- POJ 3616【数状数组求区间最大值 + 简单DP】
- POJ 3186 Treats for the Cows 一个简单DP
- POJ 3140 Contestants Division (删边,简单树形DP)
- 简单DP+暴力 POJ 1050
- POJ 3616 Milking Time(简单DP)
- POJ 1260 Pearls (简单DP)
- POJ 3616 Milking Time 简单DP
- POJ 2441 Arrange the Bulls 状态压缩递推简单题 (状态压缩DP)
- POJ 1018 Communication System(简单DP)
- poj 1160 Post Office(DP-简单DP)
- Apple Catching (poj 2385 简单dp)