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 **************************************/
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 }
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 }
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 }
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 }
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 }
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 }
嵌套矩形 类似最长上升子序 因没排序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 }
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 }
因为它只能从两个方向走过来 很巧妙的可以转换为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 }
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 }
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 }
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 }
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 }
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 }
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 }
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 }
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 }
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 }
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 }
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 }
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 }