title: ACM-学习记录-DP-1
tags:

  • ACM
  • DP
    abbrlink: 2470a0b3
    date: 2020-11-26 19:43:43

DPL_1_A: Coin Changing Problem

每次均有两种选择,即选择当前的,即为在当前状态+1,否则维持原来的T[j+d[i]]

  1. #include<iostream>
  2. #include<cstdlib>
  3. #include<cstring>
  4. using namespace std;
  5. const int INF=(1<<29);
  6. int main()
  7. {
  8. int n,m;
  9. int d[20+5];
  10. int T[50000 + 5];
  11. cin>>n>>m;
  12. for(int i=1;i<=m;i++)
  13. cin>>d[i];
  14. for(int i=0;i<50000+5;i++)
  15. {
  16. T[i]=INF;
  17. }
  18. T[0]=0;
  19. //for(int i=0;i<=50000+5;i++) cout<<T[i]<<endl;
  20. for(int i=1;i<=m;i++)
  21. {
  22. for(int j=0;j+d[i]<=n;j++)
  23. {
  24. T[j + d[i]] = min(T[j+d[i]], T[j]+1);
  25. }
  26. }
  27. cout<<T[n]<<endl;
  28. return 0;
  29. }

DPL_1_B: 0-1 Knapsack Problem

  1. #include<iostream>
  2. #include<vector>
  3. #include<algorithm>
  4. #define NMAX 105
  5. #define WMAX 10005
  6. using namespace std;
  7. struct Item{
  8. int value;
  9. int weight;
  10. };
  11. int N,W;
  12. Item items[NMAX];
  13. int C[NMAX][WMAX], G[NMAX][WMAX];
  14. void compute(int &maxValue, vector<int> &selection)
  15. {
  16. for(int w=0;w<=W;w++)
  17. {
  18. C[0][w]=0;
  19. G[0][w]=1;
  20. }
  21. for(int i=1;i<=N;i++)
  22. C[i][0]=0;
  23. for(int i=1;i<=N;i++)
  24. {
  25. for(int w=1;w<=W;w++)
  26. {
  27. C[i][w]=C[i-1][w];
  28. G[i][w]=0;
  29. if(items[i].weight>w) continue;
  30. if(items[i].value + C[i-1][w-items[i].weight]>C[i-1][w])
  31. {
  32. C[i][w]=items[i].value + C[i-1][w-items[i].weight];
  33. G[i][w]=1;
  34. }
  35. }
  36. }
  37. maxValue=C[N][W];
  38. selection.clear();
  39. for(int i=N,w=W;i>=1;i--)
  40. {
  41. if(G[i][w]==1)
  42. {
  43. selection.push_back(i);
  44. w-=items[i].weight;
  45. }
  46. }
  47. reverse(selection.begin(), selection.end());
  48. }
  49. int main()
  50. {
  51. int maxValue;
  52. vector<int> selection;
  53. cin>>N>>W;
  54. for(int i=1;i<=N;i++)
  55. {
  56. cin>>items[i].value>>items[i].weight;
  57. }
  58. compute(maxValue, selection);
  59. cout<<maxValue<<endl;
  60. return 0;
  61. }

NEFUOJ P21 最长上升子序列

  1. #include<iostream>
  2. #include<algorithm>
  3. #define MAX 100000
  4. using namespace std;
  5. int n,A[MAX+1],L[MAX];
  6. int lis()
  7. {
  8. L[0]=A[0];
  9. int length=1;
  10. for(int i=1;i<n;i++)
  11. {
  12. if(L[length-1]<A[i])
  13. {
  14. L[length++]=A[i];
  15. }
  16. else
  17. *lower_bound(L, L+length, A[i])=A[i];
  18. }
  19. return length;
  20. }
  21. int main()
  22. {
  23. cin>>n;
  24. for(int i=0;i<n;i++)
  25. {
  26. cin>>A[i];
  27. }
  28. cout<<lis()<<endl;
  29. return 0;
  30. }

DPL_3_A: Largest Square

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstdio>
  4. using namespace std;
  5. #define MAX 1400
  6. int dp[MAX][MAX], G[MAX][MAX];
  7. int getS(int H,int W)
  8. {
  9. int maxWidth = 0;
  10. for(int i=0;i<H;i++)
  11. {
  12. for(int j=0;j<W;j++)
  13. {
  14. dp[i][j]=(G[i][j]+1)%2;
  15. maxWidth |= dp[i][j];
  16. }
  17. }
  18. for(int i=1;i<H;i++)
  19. {
  20. for(int j=1;j<W;j++)
  21. {
  22. if(G[i][j])
  23. {
  24. dp[i][j]=0;
  25. }
  26. else
  27. {
  28. dp[i][j]=min(dp[i-1][j-1], min(dp[i-1][j], dp[i][j-1])) + 1;
  29. maxWidth=max(maxWidth, dp[i][j]);
  30. }
  31. }
  32. }
  33. return maxWidth * maxWidth;
  34. }
  35. int main()
  36. {
  37. int H,W;
  38. cin>>H>>W;
  39. for(int i=0;i<H;i++)
  40. for(int j=0;j<W;j++)
  41. cin>>G[i][j];
  42. cout<<getS(H,W)<<endl;
  43. return 0;
  44. }