• 动态规划 贪心算法


    一共有 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. }
  • 相关阅读:
    电脑卡怎么办?4招帮你解决电脑卡顿的烦恼!
    RabbitMQ学习一 安装
    有个前辈把牛客网的Java面试笔记在GitHub开源了
    腾讯云我的世界mc服务器配置选择(价格值得)
    SpringMVC源码分析(三)HandlerExceptionResolver启动和异常处理源码分析
    软考-高项-论文-信息系统项目的质量管理
    Kubernetes容器状态探测的艺术
    数学建模-多目标规划算法(美赛建模)
    计算机毕业设计选题推荐-房屋租赁系统-Java/Python项目实战
    四川网页设计公司哪家好?成都网站制作公司哪家好?
  • 原文地址:https://blog.csdn.net/taotaoah/article/details/125469465