ZOJ - 3777 && ZOJ - 2972(dp )

待我称王封你为后i 2022-05-26 03:39 350阅读 0赞

这两个dp感觉非常类似, 都是dfs会超时, 利用上一层和下一层关系, dp做出来

zoj 2972

  1. #include<cstdio>
  2. #include<cmath>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. const double ep=1e-10;
  7. const int INF=0x3f3f3f3f;
  8. int n, m;
  9. struct node {
  10. int t1, t2, t3, c1, c2;
  11. } lan[120];
  12. int dp[120][120];
  13. int main() {
  14. int T;
  15. scanf("%d", &T);
  16. while(T--) {
  17. memset(dp, 0x3f, sizeof(dp));
  18. scanf("%d%d", &n, &m);
  19. for(int i=1; i<=n; i++)
  20. scanf("%d%d%d%d%d", &lan[i].t1, &lan[i].t2, &lan[i].t3, &lan[i].c1, &lan[i].c2);
  21. dp[0][m]=0;
  22. for(int i=1; i<=n; i++) {
  23. for(int j=0; j<=m; j++) {
  24. if(m>=j+lan[i].c1)
  25. dp[i][j]=min(dp[i][j], dp[i-1][j+lan[i].c1]+lan[i].t1);
  26. dp[i][j]=min(dp[i][j], dp[i-1][j]+lan[i].t2);
  27. int tmp=min(m, j+lan[i].c2);
  28. dp[i][tmp]=min(dp[i][tmp], dp[i-1][j]+lan[i].t3);
  29. }
  30. }
  31. int ans=INF;
  32. for(int i=0; i<=m; i++)
  33. ans=min(dp[n][i], ans);
  34. printf("%d\n", ans);
  35. }
  36. return 0;
  37. }

zoj 3777

  1. #include<cstdio>
  2. #include<cstring>
  3. using namespace std;
  4. typedef long long ll;
  5. int p[15][15];
  6. ll dp[1<<13][600];
  7. ll fact(ll n){
  8. ll ans=1;
  9. for(ll i=1; i<=n; i++)
  10. ans*=i;
  11. return ans;
  12. }
  13. ll gcd(ll a, ll b){
  14. return b==0 ? a : gcd(b, a%b);
  15. }
  16. int main() {
  17. int T;
  18. scanf("%d", &T);
  19. while(T--) {
  20. memset(dp, 0, sizeof(dp));
  21. int n, m;
  22. scanf("%d%d", &n, &m);
  23. for(int i=1; i<=n; i++)
  24. for(int j=1; j<=n; j++)
  25. scanf("%d", &p[i][j]);
  26. dp[0][0]=1;
  27. for(int i=0; i<(1<<n); i++)
  28. {
  29. int tmp=1;
  30. for(int j=0; j<n; j++)
  31. if(i&(1<<j)) tmp++;
  32. for(int j=1; j<=n; j++)
  33. {
  34. if(i&(1<<(j-1))) continue;
  35. for(int k=0; k<=m; k++)
  36. {
  37. if(k+p[tmp][j]>=m)
  38. dp[(i|(1<<(j-1)))][m]+=dp[i][k];
  39. else
  40. dp[(i|(1<<(j-1)))][k+p[tmp][j]]+=dp[i][k];
  41. }
  42. }
  43. }
  44. if(dp[(1<<n)-1][m]!=0)
  45. {
  46. ll t1=fact(n), t2=dp[(1<<n)-1][m], t3=gcd(t1, t2);
  47. printf("%lld/%lld\n", t1/t3, t2/t3);
  48. }
  49. else
  50. printf("No solution\n");
  51. }
  52. return 0;
  53. }

发表评论

表情:
评论列表 (有 0 条评论,350人围观)

还没有评论,来说两句吧...

相关阅读

    相关 ZOJ 3537 区间dp

    题意:给出一些点表示多边形蛋糕的定点的位置(如果蛋糕是凹多边形就不能切),切蛋糕时每次只能在顶点和顶点间切,每一次切蛋糕都有相应的代价,给出代价的公式,问把蛋糕切成多个三角形的