DP录 (更新)

补补弱项 全面发展。。

从最基础来

sdut1299最长上升子序

 1 #include <iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<algorithm>

 5 #include<stdlib.h>

 6 using namespace std;

 7 int dp[1100];

 8 int a[1100];

 9 int main()

10 {

11     int i,j,k,n;

12     cin>>n;

13     for(i =1; i <= n ; i++)

14     {

15         cin>>a[i];

16         dp[i] = 1;

17     }

18     for(i = 1; i <= n ;i++)

19     for(j = 1 ; j < i ; j++)

20     if(a[i]>a[j])

21     {

22         dp[i] = max(dp[j]+1,dp[i]);

23     }

24     int maxz = 0;

25     for(i = 1; i <= n ;i++)

26     maxz = max(dp[i],maxz);

27     cout<<maxz<<endl;

28     return 0;

29 }

30  

31 

32 

33 

34 /**************************************

35     Problem id    : SDUT OJ 1299 

36     User name    : 尚雨 

37     Result        : Accepted 

38     Take Memory    : 476K 

39     Take Time    : 0MS 

40     Submit Time    : 2013-08-05 09:26:48  

41 **************************************/
View Code

hdu2084数塔

 1 #include <iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<algorithm>

 5 #include<stdlib.h>

 6 using namespace std;

 7 int dp[110][110];

 8 int a[110][110];

 9 int main()

10 {

11     int i,j,k,n,t;

12     cin>>t;

13     while(t--)

14     {

15         cin>>n;

16         memset(dp,0,sizeof(dp));

17         for(i = 1; i <= n ;i++)

18         for(j = 1; j <= i ;j++)

19         cin>>a[i][j];

20         for(j = 1; j <= n ; j++)

21         dp[n][j] = a[n][j];

22         for(i = n-1 ; i >= 1 ;i--)

23         for(j = 1; j <= i ; j++)

24         {

25             dp[i][j]=a[i][j]+max(dp[i+1][j],dp[i+1][j+1]);

26         }

27         cout<<dp[1][1]<<endl;

28     }

29     return 0;

30 }
View Code

hdu1159最长公共子序列

 1 #include <iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<algorithm>

 5 #include<stdlib.h>

 6 using namespace std;

 7 int dp[1100][1100];

 8 char s1[1100],s2[1100];

 9 int main()

10 {

11     int i,j,k1,k2;

12     while(cin>>s1)

13     {

14         k1 = strlen(s1);

15         cin>>s2;

16         k2 = strlen(s2);

17         memset(dp,0,sizeof(dp));

18         for(i = 1 ; i <= k1 ; i++)

19             for(j = 1 ; j <= k2 ; j++)

20             {

21                 if(s1[i-1]==s2[j-1])

22                 dp[i][j] = dp[i-1][j-1]+1;

23                 else

24                 dp[i][j] = max(dp[i-1][j],dp[i][j-1]);

25             }

26         cout<<dp[k1][k2]<<endl;

27     }

28     return 0;

29 }
View Code

hdu1003最大子段和

 1 #include <iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<algorithm>

 5 #include<stdlib.h>

 6 using namespace std;

 7 #define INF 0xfffffff

 8 int dp[110000];

 9 int a[100010];

10 int main()

11 {

12     int i,j,n,t,kk=0;

13     cin>>t;

14     while(t--)

15     {

16         cin>>n;kk++;

17         for(i = 1; i <= n ;i++)

18         cin>>a[i];

19         int maxz = -INF,tmaxz=0;

20         int x=1,y,tx=1;

21         for(i =  1; i <= n ;i++)

22         {

23             tmaxz+=a[i];

24             if(tmaxz>maxz)

25             {

26                 maxz = tmaxz;

27                 x = tx;

28                 y = i;

29             }

30             if(tmaxz<0)

31             {

32                 tmaxz=0;

33                 tx = i+1;

34             }

35         }

36         printf("Case %d:\n",kk);

37         cout<<maxz<<" "<<x<<" "<<y<<endl;

38         if(t!=0)

39         puts("");

40     }

41     return 0;

42 }
View Code

 sdut1225http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1225

 1 #include <iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<algorithm>

 5 #include<stdlib.h>

 6 using namespace std;

 7 char s1[1050],s2[1050];

 8 int dp[1050][1050];

 9 int main()

10 {

11     int i,j,k1,k2;

12     while(cin>>s1)

13     {

14         cin>>s2;

15         memset(dp,0,sizeof(dp));

16         k1 = strlen(s1);

17         k2 = strlen(s2);

18         for(i = 0 ; i <= k1 ; i++)

19         dp[i][0] = i;

20         for(i = 0 ; i <= k2 ; i++)

21         dp[0][i] = i;

22         for(i = 1 ; i <= k1 ; i++)

23             for(j = 1 ; j <= k2 ; j++)

24             {

25                 if(s1[i-1]==s2[j-1])

26                 dp[i][j] = dp[i-1][j-1];

27                 else

28                 dp[i][j] = dp[i-1][j-1]+1;

29                 dp[i][j] = min(dp[i][j],min(dp[i-1][j]+1,dp[i][j-1]+1));

30             }

31         cout<<dp[k1][k2]<<endl;

32     }

33     return 0;

34 }
View Code

 hdu1058 预处理出所有的数 预处理的技巧挺好

 1 #include <iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<stdlib.h>

 5 #include<algorithm>

 6 using namespace std;

 7 int dp[6010];

 8 void init()

 9 {

10     int i,j,a=2,b=3,c=5,d=7,ii,jj,g,o;

11     ii=jj=g=o=1;

12     dp[1] = 1;

13     for(i = 2; i <= 5842 ;i++)

14     {

15         int x = dp[ii]*a;

16         int y = dp[jj]*b;

17         int z = dp[g]*c;

18         int w = dp[o]*d;

19         dp[i] = min(min(x,y),min(z,w));

20         if(dp[i]==x)

21         ii++;

22         if(dp[i]==y)

23         jj++;

24         if(dp[i]==z)

25         g++;

26         if(dp[i]==w)

27         o++;

28     }

29 }

30 int main()

31 {

32     int i,j,k,n;

33     init();

34     while(cin>>n)

35     {

36         if(n==0)

37         break;

38         if(n%10==1&&n%100!=11)

39         printf("The %dst humble number is %d.\n",n,dp[n]);

40         else if(n%10==2&&n%100!=12)

41         printf("The %dnd humble number is %d.\n",n,dp[n]);

42         else if(n%10==3&&n%100!=13)

43         printf("The %drd humble number is %d.\n",n,dp[n]);

44         else

45         printf("The %dth humble number is %d.\n",n,dp[n]);

46     }

47     return 0;

48 }
View Code

hdu2571 类似数塔

 1 #include <iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<algorithm>

 5 #define INF 0xfffffff

 6 using namespace std;

 7 int dp[30][1010];

 8 int v[30][1010];

 9 int main()

10 {

11     int i,j,n,m,t,g;

12     cin>>t;

13     while(t--)

14     {

15         cin>>n>>m;

16         for(i = 1; i <= n ;i++)

17             for(j = 1; j <= m ; j++)

18             {

19                cin>>v[i][j];

20                dp[i][j] = -INF;

21             }

22         dp[1][1] = v[1][1];

23         for(i = 1;i <= n ;i++)

24             for(j = 1; j <= m ; j++)

25             {

26                 if(i<n)

27                 dp[i+1][j] = max(dp[i][j]+v[i+1][j],dp[i+1][j]);

28                 if(j<m)

29                 dp[i][j+1] = max(dp[i][j]+v[i][j+1],dp[i][j+1]);

30                 for(g = 2;;g++)

31                 {

32                     if(g*j>m)

33                     break;

34                     dp[i][g*j] = max(dp[i][j]+v[i][g*j],dp[i][g*j]);

35                 }

36             }

37         cout<<dp[n][m]<<endl;

38     }

39     return 0;

40 }
View Code

 嵌套矩形 类似最长上升子序 因没排序WA了几次

 1 #include <iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<algorithm>

 5 #include<stdlib.h>

 6 using namespace std;

 7 struct node

 8 {

 9     int a,b;

10 }q[1010];

11 int dp[1010];

12 bool cmp(node a,node b)

13 {

14     if(a.a==b.a)

15     return a.b<b.b;

16     return a.a<b.a;

17 }

18 int main()

19 {

20     int i,j,t,n,tt;

21     cin>>t;

22     while(t--)

23     {

24         cin>>n;

25         memset(dp,0,sizeof(dp));

26         for(i = 1; i <= n ;i++)

27         {

28             cin>>q[i].a>>q[i].b;

29             if(q[i].a>q[i].b)

30             {

31                 tt = q[i].a;

32                 q[i].a = q[i].b;

33                 q[i].b = tt;

34             }

35             dp[i] = 1;

36         }

37         sort(q+1,q+n+1,cmp);

38         for(i = 1; i <= n ; i++)

39             for(j = 1; j  < i ; j++)

40             {

41                 if(((q[i].a>q[j].a)&&(q[i].b>q[j].b))||(q[i].b>q[j].a&&q[i].a>q[j].b))

42                 dp[i] = max(dp[i],dp[j]+1);

43             }

44         int maxz=0;

45         for(i = 1; i <= n ;i++)

46         maxz = max(maxz,dp[i]);

47         cout<<maxz<<endl;

48     }

49     return 0;

50 }
View Code

    Vijos 1493 传纸条 多进程DP

四维

 1 #include <iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<algorithm>

 5 #include<stdlib.h>

 6 using namespace std;

 7 int dp[51][51][51][51];

 8 int a[51][51];

 9 int main()

10 {

11     int i,j,n,m,g,o;

12     while(cin>>n>>m)

13     {

14         memset(dp,0,sizeof(dp));

15         memset(a,0,sizeof(a));

16         for(i = 1; i <= n ; i++)

17             for(j = 1; j <= m ; j++)

18             scanf("%d",&a[i][j]);

19         for(i = 1; i <= n ;i++)

20             for(j = 1 ; j <= m ; j++)

21                 for(g = 1; g <= n ; g++)

22                     for(o = 1 ;o <= m ;o++)

23                     {

24                         dp[i][j][g][o] = max(max(dp[i-1][j][g-1][o],dp[i-1][j][g][o-1]),max(dp[i][j-1][g-1][o],dp[i][j-1][g][o-1]));

25                         if(i==g&&j==o)

26                         dp[i][j][g][o]+=a[i][j];

27                         else

28                         dp[i][j][g][o]+=a[i][j]+a[g][o];

29                     }

30         printf("%d\n",dp[n][m][n][m]);

31     }

32     return 0;

33 }
View Code

因为它只能从两个方向走过来 很巧妙的可以转换为3维的 

 1 #include <iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<algorithm>

 5 #include<stdlib.h>

 6 using namespace std;

 7 int dp[101][51][51];

 8 int a[51][51],d[101][51];

 9 int main()

10 {

11     int i,j,n,m,g,o,x,y,z,p;

12     while(cin>>n>>m)

13     {

14         memset(dp,0,sizeof(dp));

15         memset(d,0,sizeof(d));

16         for(i = 1; i <= n ; i++)

17             for(j = 1; j <= m ; j++)

18             {

19                 scanf("%d",&a[i][j]);

20                 if(i+j>n)

21                 d[i+j-1][n-i+1] = a[i][j];

22                 else

23                 d[i+j-1][j] = a[i][j];

24             }

25         for(i = 1; i < n+m ; i++)

26             for(j = 1 ;j <= m ; j++)

27                 for(g = 1; g <= m ;g++)

28                 {

29                     if(i <= n)

30                     {

31                         x = dp[i-1][j][g-1];

32                         y = dp[i-1][j-1][g-1];

33                         z = dp[i-1][j][g];

34                         p = dp[i-1][j-1][g];

35                     }

36                     else

37                     {

38                         x = dp[i-1][j][g];

39                         y = dp[i-1][j+1][g+1];

40                         z = dp[i-1][j+1][g];

41                         p = dp[i-1][j][g+1];

42                     }

43                     dp[i][j][g] = max(max(x,y),max(z,p));

44                     if(j==g)

45                     dp[i][j][g]+=d[i][j];

46                     else

47                     dp[i][j][g]+=d[i][j]+d[i][g];

48                 }

49         cout<<dp[n+m-1][1][1]<<endl;

50 

51     }

52     return 0;

53 }
View Code

 hdu1059http://acm.hdu.edu.cn/showproblem.php?pid=1059

多重背包 优化一下 时间卡的很紧

 1 #include <iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<cstring>

 5 #include<algorithm>

 6 #include<stdlib.h>

 7 using namespace std;

 8 int a[10],b[20010],d[33];

 9 int dp[1000010];

10 int main()

11 {

12     int i,j,k,s=0,g,n=0,kk=0;

13     while(scanf("%d",&a[1])!=EOF)

14     {

15         s=0;

16         s+=a[1];g=0;kk++;

17         memset(b,0,sizeof(b));

18         for(i = 2; i <= 6 ; i++)

19         {

20             scanf("%d",&a[i]);

21             s+=a[i]*i;

22             n+=a[i];

23         }

24         if(s==0) break;

25         printf("Collection #%d:\n",kk);

26         if(s%2!=0)

27         {

28             printf("Can't be divided.\n\n");

29             continue;

30         }

31         else

32         s = s/2;

33         d[1] = 1;

34         for(i = 0 ; i <= s ; i++)

35         dp[i] = 0;

36         for(i = 2; i  < 30 ; i++)

37         d[i] = d[i-1]<<1;

38         j=0;

39         for(i = 1; i <= 6 ; i++)

40         {

41             k = 1;

42             while(a[i]>d[k])

43             {

44                 a[i]-=d[k];

45                 b[++j] = d[k]*i;

46                 k++;

47             }

48             if(a[i])

49             {

50                 b[++j] = a[i]*i;

51             }

52         }

53         k = j;

54         for(i = 1; i <= k ; i++)

55         for(j = s ; j >= b[i] ; j--)

56         {

57             dp[j] = max(dp[j-b[i]]+b[i],dp[j]);

58         }

59         if(dp[s]==s)

60         printf("Can be divided.\n");

61         else

62         printf("Can't be divided.\n");

63         puts("");

64     }

65     return 0;

66 }
View Code

 hdu1176免费馅饼 http://acm.hdu.edu.cn/showproblem.php?pid=1176

将每秒的状态合起来类似数塔 倒推回去就行

 1 #include <iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<algorithm>

 5 #include<stdlib.h>

 6 using namespace std;

 7 int dp[100010][15];

 8 int main()

 9 {

10     int i,j,k,n,x,t;

11     while(scanf("%d",&n)&&n)

12     {

13         memset(dp,0,sizeof(dp));

14         int maxz=0;

15         for(i = 1 ;i <= n ; i++)

16         {

17             scanf("%d%d",&x,&t);

18             dp[t][x+1]++;

19             maxz = max(maxz,t);

20         }

21         for(i = maxz-1 ; i >= 0; i--)

22            for(j = 1 ; j <= 11 ; j++)

23            {

24                dp[i][j]+=max(max(dp[i+1][j-1],dp[i+1][j+1]),dp[i+1][j]);

25            }

26         cout<<dp[0][6]<<endl;

27     }

28     return 0;

29 }
View Code

 hdu1069http://acm.hdu.edu.cn/showproblem.php?pid=1069 每个矩形算六个 排序后类似最长上升子序

 1 #include <iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<algorithm>

 5 #include<stdlib.h>

 6 #define N 40

 7 using namespace std;

 8 struct node

 9 {

10     int x,y,z;

11 }rc[N*6];

12 int g,dp[310];

13 void init(int a,int b,int c)

14 {

15     rc[++g].x = a;

16     rc[g].y = b;

17     rc[g].z = c;

18     rc[++g].x = b;

19     rc[g].y = a;

20     rc[g].z = c;

21     rc[++g].x = a;

22     rc[g].y = c;

23     rc[g].z = b;

24     rc[++g].x = b;

25     rc[g].y = c;

26     rc[g].z = a;

27     rc[++g].x = c;

28     rc[g].y = b;

29     rc[g].z = a;

30     rc[++g].x = c;

31     rc[g].y = a;

32     rc[g].z = b;

33 }

34 bool cmp(node a,node b)

35 {

36     if(a.x==b.x)

37     return a.y>b.y;

38     return a.x>b.x;

39 }

40 int main()

41 {

42     int i,j,n,a,b,c,kk=0;

43     while(cin>>n)

44     {

45         g=0;kk++;

46         if(n==0) break;

47         memset(dp,0,sizeof(dp));

48         for(i = 1;i <= n ; i++)

49         {

50             scanf("%d%d%d",&a,&b,&c);

51             init(a,b,c);

52         }

53         sort(rc+1,rc+g+1,cmp);

54         for(i = 1; i <= g ; i++)

55         dp[i] = rc[i].z;

56         for(i = 1; i <= g ; i++)

57             for(j = 1; j < i ; j++)

58             {

59                 if(rc[j].x>rc[i].x&&rc[j].y>rc[i].y)

60                 dp[i] = max(dp[i],dp[j]+rc[i].z);

61             }

62         int maxz=0;

63         printf("Case %d: maximum height = ",kk);

64         for(i = 1; i <= g ; i++)

65         maxz = max(dp[i],maxz);

66         cout<<maxz<<endl;

67     }

68     return 0;

69 }
View Code

 hdu1081http://acm.hdu.edu.cn/showproblem.php?pid=1081 记录从i到j行g列的和 转换为一维的最大子段和 

 1 #include <iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<stdlib.h>

 5 #include<algorithm>

 6 using namespace std;

 7 #define INF 0xfffffff

 8 int a[110][110],s[105][105][105],c[105][105][105];

 9 int main()

10 {

11     int i,j,k,n,g;

12     while(scanf("%d",&n)!=EOF)

13     {

14         memset(s,0,sizeof(s));

15         memset(c,0,sizeof(c));

16         for(i = 1; i <= n ; i++)

17             for(j = 1 ;j <= n ;j++)

18             scanf("%d",&a[i][j]);

19         for(i = 1; i <= n ; i++)

20             for(j = 1 ;j <= n ; j++)

21             {

22                 s[j][j][i] = a[j][i];

23                 for(g = j+1; g <= n ; g++)

24                 s[j][g][i]=a[g][i]+s[j][g-1][i];

25             }

26         int maxz = -INF,tmaxz=0;

27         for(i = 1; i <= n ; i++)

28             for(j = 1; j <= n ; j++)

29             {

30                 tmaxz=0;

31                 for(g = 1 ;g <= n ;g++)

32                 {

33                     tmaxz+=s[i][j][g];

34                     if(tmaxz>maxz)

35                     maxz=tmaxz;

36                     if(tmaxz<0)

37                     tmaxz = 0;

38                 }

39             }

40           cout<<maxz<<endl;

41 

42     }

43     return 0;

44 }
View Code

 

 hdu1087 水题

 1 #include <iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<algorithm>

 5 #include<stdlib.h>

 6 using namespace std;

 7 #define LL long long

 8 int a[1010];

 9 LL dp[1010];

10 int main()

11 {

12     int i,j,k,n;

13     while(cin>>n)

14     {

15         if(!n) break;

16         memset(dp,0,sizeof(dp));

17         for(i = 1; i <= n ; i++)

18         {

19             cin>>a[i];

20             dp[i] = a[i];

21         }

22         for(i = 1 ;i <= n ; i++)

23             for(j = 1; j < i ; j++)

24             if(a[i]>a[j])

25             dp[i] = max(dp[i],dp[j]+a[i]);

26         LL maxz=dp[1];

27         for(i = 2 ;i <= n ;i++)

28         if(dp[i]>maxz)

29         maxz = dp[i];

30         cout<<maxz<<endl;

31     }

32     return 0;

33 }
View Code

hdu1158http://acm.hdu.edu.cn/showproblem.php?pid=1158二维DP 三重循环 以前居然做过 好扯 居然一点印象没有 好认真的推了半张纸。。

 1 #include <iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<algorithm>

 5 #include<stdlib.h>

 6 using namespace std;

 7 #define INF 0xfffffff

 8 int dp[20][1010],num[20];

 9 int main()

10 {

11     int i,j,k,n,m,a,b,c,g;

12     while(cin>>n)

13     {

14         if(!n) break;

15         cin>>a>>b>>c;

16         memset(dp,0,sizeof(dp));

17         memset(num,0,sizeof(num));

18         int maxz=0,minz;

19         for(i = 1; i <= n ;i++)

20         {

21             cin>>num[i];

22             if(num[i]>maxz)

23             maxz = num[i];

24             if(num[i]<minz)

25             minz = num[i];

26         }

27         for(i = 1;i <= n ;i++)

28             for(j = 0 ; j <= maxz ; j++)

29             dp[i][j] = INF;

30         for(i = 0 ; i <= maxz ; i++)

31         dp[1][i] = i*(a+b);

32         for(i = 2; i <= n ; i++)

33             for(j = num[i-1] ; j <= maxz ; j++)

34                 for(g = num[i] ; g <= maxz ; g++)

35                 {

36                     if(g>j)

37                     dp[i][g] = min(dp[i][g],dp[i-1][j]+(g-j)*a+g*b);

38                     else if(g<j)

39                     dp[i][g] = min(dp[i][g],dp[i-1][j]+(j-g)*c+g*b);

40                     else

41                     dp[i][g] = min(dp[i][g],dp[i-1][j]+g*b);

42                 }

43         int maxzz = INF;

44         for(i = num[n] ;i <= maxz ;i++)

45         if(dp[n][i]<maxzz)

46           maxzz = dp[n][i];

47         cout<<maxzz<<endl;

48     }

49     return 0;

50 }
View Code

 hdu1165http://acm.hdu.edu.cn/showproblem.php?pid=1165 这题确实不能算DP  我还傻乎乎的写了一递归  M比较小 直接推就好 了

 1 #include <iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<algorithm>

 5 #include<stdlib.h>

 6 using namespace std;

 7 #define LL long long

 8 #define N 1000010

 9 int n,m;

10 LL dp[4][N+10];

11 int main()

12 {

13     int i,j;

14     for(i = 0 ; i <= N ; i++)

15     dp[0][i] = i+1;

16     dp[1][0] = 2;

17     dp[2][0] = 3;

18     dp[3][0] = 5;

19     for(i = 1 ; i <= N ; i++)

20     dp[3][i] = dp[1][0]*dp[3][i-1]+3;

21     while(scanf("%d%d",&m,&n)!=EOF)

22     {

23         if(m==1)

24         dp[m][n] = dp[1][0]+n;

25         else if(m==2)

26         dp[m][n] = dp[1][0]*n+dp[2][0];

27         cout<<dp[m][n]<<endl;

28     }

29     return 0;

30 }
View Code

 hdu1506 http://acm.hdu.edu.cn/status.php 题不错 记录i左边及右边第一个比它小的位置 用来求以它为高的最大面积 求位置的时候 dp一下下吧 

注意。。杭电上long long会无限WA。。用——int64

 1 #include <iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<algorithm>

 5 #include<stdlib.h>

 6 using namespace std;

 7 #define N 100100

 8 __int64 a[N],dp1[N],dp2[N];

 9 __int64 s;

10 int main()

11 {

12     int i,n;

13     while(cin>>n)

14     {

15         if(!n) break;

16         for(i = 1 ;i <= n ;i++)

17         scanf("%I64d",&a[i]);

18         dp1[1] = 0;

19         a[0] = -1;

20         for(i = 2; i <= n ;i++)

21         {

22             if(a[i]>a[i-1])

23             dp1[i] = i-1;

24             else

25             {

26                 int x = i-1;

27                 while(x>=1&&a[x]>=a[i])

28                 {

29                     x = dp1[x];

30                 }

31                 dp1[i] = x;

32             }

33         }

34         dp2[n] = n+1;

35         a[n+1] = -1;

36         for(i = n-1; i >= 1 ;i--)

37         if(a[i]>a[i+1])

38         dp2[i] = i+1;

39         else

40         {

41             int x = i+1;

42             while(x<=n&&a[x]>=a[i])

43             {

44                 x = dp2[x];

45             }

46             dp2[i] = x;

47         }

48         long long maxz=0;

49         for(i = 1 ;i <= n ; i++)

50         {

51             s = (dp2[i]-dp1[i]-1)*a[i];

52             maxz = max(s,maxz);

53         }

54         printf("%I64d\n",maxz);

55     }

56     return 0;

57 }
View Code

 

 hdu1712http://acm.hdu.edu.cn/showproblem.php?pid=1712 简单二维DP

 1 #include <iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<algorithm>

 5 #include<stdlib.h>

 6 using namespace std;

 7 int dp[110][110];

 8 int a[110][110];

 9 int main()

10 {

11     int i,j,g,n,m;

12     while(cin>>n>>m)

13     {

14         if(!n&&!m) break;

15         memset(a,0,sizeof(a));

16         memset(dp,0,sizeof(dp));

17         for(i = 1;i <= n ; i++)

18             for(j = 1 ;j <= m ; j++)

19             scanf("%d",&a[i][j]);

20         for(i = 1;i <= n ; i++)

21             for(j = 1 ; j <= m ; j++)

22             for(g = 0; g<= j ; g++)

23             dp[i][j] = max(dp[i-1][g]+a[i][j-g],dp[i][j]);

24         int maxz = 0;

25         for(i = 0; i <= m ;i++)

26         maxz = max(maxz,dp[n][i]);

27         cout<<maxz<<endl;

28     }

29     return 0;

30 }
View Code

 

 hdu2372http://acm.hdu.edu.cn/showproblem.php?pid=2372 又一水DP

 1 #include <iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<algorithm>

 5 #include<stdlib.h>

 6 using namespace std;

 7 #define LL __int64

 8 LL dp[110][110];

 9 int a[110];

10 int main()

11 {

12     int i,j,g,n,k;

13     while(cin>>n>>k)

14     {

15         if(!n&&!k) break;

16         memset(dp,0,sizeof(dp));

17         for(i =1 ;i <= n ; i++)

18         {

19             scanf("%d",&a[i]);

20             dp[i][1] = 1;

21         }

22         for(i = 1; i <= n ;i++)

23             for(j = 1;j<=i&&j <= k ; j++)

24             for(g = 1 ; g < i ; g++)

25             if(a[i]>a[g])

26             dp[i][j] += dp[g][j-1];

27         LL maxz=0;

28         for(i = k ; i <= n ; i++)

29             maxz+=dp[i][k];

30         cout<<maxz<<endl;

31     }

32     return 0;

33 }
View Code

 hdu4223http://acm.hdu.edu.cn/showproblem.php?pid=4223 这题不能算DP吧 预处理一下

 1 #include <iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<algorithm>

 5 #include<stdlib.h>

 6 #include<cmath>

 7 using namespace std;

 8 #define LL __int64

 9 #define INF 0xfffffff

10 int s[1010];

11 int a[1010];

12 int main()

13 {

14     int i,j,k,n,kk=0,t;

15     cin>>t;

16     while(t--)

17     {

18         cin>>n;kk++;

19         memset(s,0,sizeof(s));

20         for(i = 1; i <= n ; i++)

21         {

22             scanf("%d",&a[i]);

23             s[i] = s[i-1]+a[i];

24         }

25         int minz=INF;

26         for(i = 1; i <= n ; i++)

27             for(j = 0; j < i ; j++)

28             {

29                 int x = abs(s[i]-s[j]);

30                 minz = min(minz,x);

31             }

32         printf("Case %d: ",kk);

33         cout<<minz<<endl;

34     }

35     return 0;

36 }
View Code

 

 hdu4159http://acm.hdu.edu.cn/showproblem.php?pid=4159

一直想推概率 结果怎么也推不出来 后来想到可以推可能的种数  因为太大WA了 又去想推概率 还是没退出 最后除了个很大的数 过了

 1 #include <iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<stdlib.h>

 5 #include<algorithm>

 6 using namespace std;

 7 #define MM 1000000000000000.0

 8 double dp[55][55];

 9 int main()

10 {

11     int n,s,i,j;

12     while(cin>>n>>s)

13     {

14         memset(dp,0,sizeof(dp));

15         if(s==0)

16         {

17             printf("0.00000\n");

18             continue;

19         }

20         dp[1][s] = 2;

21         dp[1][s-1] = 1;

22         for(i = 2; i <= n ;i++)

23             for(j = 0 ; j <= s ; j++)

24             {

25                 dp[i][j] = dp[i-1][j]*2+dp[i-1][j+1];

26             }

27         double ss=0;

28         for(i = 0; i <= s ; i++)

29         {

30             ss+=dp[n][i]/MM;

31         }

32         dp[n][0] = dp[n][0]/MM;

33         double x = 1-1.0*dp[n][0]/ss;

34         printf("%.5lf\n",x*100);

35     }

36     return 0;

37 }
View Code

 

你可能感兴趣的:(dp)