动态规划入门:热血实战!
___________________________________最好的旅行,是在陌生的地方,发现了一种久违的感动。
1.poj 3624
#include<iostream> #include<cstring> using namespace std; int w[3403],d[3403],dp[12881],n,m; //注意dp数组的范围要开大!否则的话无法AC!会显示runtime error的! int main() { memset(dp,0,sizeof(dp)); //dp数组的意义要明确是神木!:在这样总重量的条件下的期望值的最大值! cin>>n>>m; for(int i=1;i<=n;i++) cin>>w[i]>>d[i]; for(int i=1;i<=n;i++) { for(int j=m;j>=w[i];j--) dp[j]=max(dp[j],dp[j-w[i]]+d[i]); } cout<<dp[m]<<endl; return 0; }
2.poj 1141
0x7FFFFFFF 的二进制表示就是除了首位是 0,其余都是1就是说,这是最大的整型数 int(因为第一位是符号位,0 表示他是正数)
#include<iostream> #include<cstdio> #include<string.h> using namespace std; #define MAXN 256 char br[MAXN]; int dp[MAXN][MAXN],pos[MAXN][MAXN]; int len; void print_br(int i,int j) { if(i>j) return; if(i==j) { if(br[i]=='(' || br[j]==')') printf("()"); else printf("[]"); } else if(pos[i][j]==-1) { printf("%c",br[i]); print_br(i+1,j-1); printf("%c",br[j]); } else { print_br(i,pos[i][j]); print_br(pos[i][j]+1,j); } } bool match(int i,int j) { if(br[i]=='(' && br[j]==')') return true; if(br[i]=='[' && br[j]==']') return true; return false; } int main() { int i,j,k,mid,t; while(gets(br)!=NULL) { memset(dp,0,sizeof(dp)); len=strlen(br); for(i=0;i<len;i++) dp[i][i]=1; for(k=1;k<len;k++) { for(i=0;i+k<len;i++) { j=i+k; dp[i][j]=0x7fffffff; if(match(i,j)) { dp[i][j]=dp[i+1][j-1]; pos[i][j]=-1; //莫失莫忘,先寿永昌! } for(mid=i;mid<j;mid++) { t=dp[i][mid]+dp[mid+1][j]; if(dp[i][j]>t) { dp[i][j]=t; pos[i][j]=mid; } } } } print_br(0,len-1); printf("\n"); } return 0; }
————————————————————————————————https://blog.csdn.net/non_cease/article/details/6870034
3.https://vjudge.net/contest/316500#problem/C