• 动态规划 贪心算法


    一共有 n个数,第 i 个数是 xi
    xi 可以取 [li , ri] 中任意的一个值。
    设 S=∑xi2S = \sum{{x_i}^2}S=∑xi​2,求 S 种类数。

     

    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. #include<vector>
    4. int a[100][100];
    5. vector<int> vec;
    6. int fun(int d){
    7. vector <int>().swap(vec);
    8. for(int i = 0; i < 100; i++){
    9. if(a[d][i] != 0){
    10. int s = a[d][i];
    11. for(int j = 0; j < 100; j++){
    12. if(a[d+1][j] != 0) vec.push_back(s + a[d+1][j]);
    13. }
    14. }
    15. }
    16. sort(vec.begin(), vec.end());
    17. vec.erase(unique(vec.begin(), vec.end()), vec.end());
    18. for(int i = 0; i < vec.size(); i++){
    19. a[d+1][i] = vec[i];
    20. }
    21. }
    22. int main(){
    23. int n;
    24. cin>>n;// n行
    25. // 二维数组初始化
    26. for(int i = 0; i < n; i++){
    27. for(int j = 0; j < 100; j++){
    28. a[i][j] = 0;
    29. }
    30. }
    31. int left, right;
    32. for(int i = 0; i < n; i++) {
    33. cin>>left>>right;
    34. int chu = left;
    35. for(int j = 0; j < right- left + 1; j++){
    36. a[i][j] = chu;
    37. chu++;
    38. }
    39. }
    40. // 输出二维数组
    41. for(int i = 0; i < n; i++){
    42. for(int j = 0; j < 100; j++){
    43. cout<<a[i][j]<<" ";
    44. }
    45. cout<<endl;
    46. }
    47. // 平方和二维数组
    48. cout<<"------------------------------"<<endl;
    49. for(int i = 0; i < n; i++){
    50. for(int j = 0; j < 100; j++){
    51. a[i][j]=a[i][j]*a[i][j];
    52. cout<<a[i][j]<<" ";
    53. }
    54. cout<<endl;
    55. }
    56. // 判断是否 重复 平方和,每行选一个数
    57. //dp
    58. /*fun(0);
    59. cout<<"第二行是否改变";
    60. for(int i = 0; i < n; i++){
    61. for(int j = 0; j < 100; j++){
    62. cout<<a[i][j]<<" ";
    63. }
    64. cout<<endl;
    65. }
    66. fun(1);
    67. cout<<"第3行是否改变";
    68. for(int i = 0; i < n; i++){
    69. for(int j = 0; j < 100; j++){
    70. cout<<a[i][j]<<" ";
    71. }
    72. cout<<endl;
    73. }
    74. */
    75. // dp
    76. for(int i = 0; i < n-1; i++){
    77. fun(i);
    78. }
    79. vec.erase(unique(vec.begin(), vec.end()), vec.end());
    80. cout<<"最终答案"<<vec.size();
    81. return 0;
    82. }
    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. int t,n,m;
    4. bitset<1000005> dp[110]; // bitset存储二进制数位的 数组
    5. int l,r;
    6. int main(){
    7. cin>>n;
    8. dp[0][0]=1;
    9. for(int i=1;i<=n;i++){
    10. cin>>l>>r;
    11. for(int j=l;j<=r;j++){
    12. dp[i]|=(dp[i-1]<<(j*j));// 每次往左移 j * j 位 ,然后或等于将重复的舍去了。 这是一个状态转移方程
    13. // 用bitset优化,dp,每输入一个范围,就是在前面已经计算的基础上加上这次范围内的数,每一次都加上l 到 r的范围的值,用|代替加法,
    14. // <<i*i把答案加入到数组中。状态转移方程是a[i]|=a[i-1]<<(i*i);
    15. //cout<<dp[i]<<endl;
    16. }
    17. cout<<endl;
    18. }
    19. //cout<<dp[n].count()<<endl; // b中值为1的二进制位的个数
    20. return 0;
    21. }
  • 相关阅读:
    gulimall基础篇回顾Day-14
    SQL SERVER LSN
    Paddlepaddle使用自己的VOC数据集训练目标检测(0废话简易教程)
    力扣(LeetCode)130. 被围绕的区域(C++)
    Spring Security 核心解读(一)整体架构
    04-jQuery动画
    精简5800三维程序
    JSON实例操作
    SQL 基本命令
    【毕业设计】31-基于单片机的农业蔬菜大棚温度自动控制系统设计(原理图工程+源码工程+仿真工程+答辩论文+答辩PPT)
  • 原文地址:https://blog.csdn.net/taotaoah/article/details/125469465