SRM520 DIVI-500pts

本文探讨了一种优化状态转移的动态规划方法,应用于解决多题得分分配问题。通过预处理减少计算复杂度,实现高效求解。文中详细介绍了状态定义、状态转移方程及关键步骤,同时提供了实现细节与代码优化技巧。

题目链接如下:

http://community.topcoder.com/stat?c=problem_statement&pm=11496&rd=14545

这个题的状态很好写出,假设dp[i][j]表示:到第i个人其得到j分时的情况个数,那么可以写出状态:

dp[i][j]=sum(dp[i-1][p],p>j)*S[i][j],其中S[i][j]表示第i个人得到j分的方法数。不难看出sum(dp[i-1][p],p>j)可以在计算的过程中预处理得出,如果S[i][j]也可以预处理的话,那么状态转移的时间复杂度可以优化到O(nm),n为人数,m为最大分值,可行!

现在我们来处理S[][],对于只做出一题和两题的情况,其方法数很好算,对于做出三题的情况,我是先计算将j得分分配给后面两题有多少中情况,然后加上最前面一题,其实方法有些挫的,还有更好的方法,我做的时候没有想到。一开始想的时候,很容易联想到将n个相同的球分给3个不同盒子的问题,初中问题啊,用插板法(一开始还忘记了。。。),其实解这个题的思路并不是插板法,但是就当温习啦。

PS:一开始实现的时候是用二维数组的,然后Test的时候就会有Kill信号,最后都改为一维数组了。另外,发现自己的代码能力越来越差,写的时候很多小Bug,然后有cha不出来。

代码如下:

#define MOD (1000000007)
#define MAXN 200000
#define _min(a,b) ((a)<(b)?(a):(b))
#define _max(a,b) ((a)>(b)?(a):(b))

int pnum[22];
int toppoint[22];

long long S[MAXN+5];
long long dp[22][MAXN+5];
long long pre[MAXN+5];
long long Stemp[MAXN];
long long psum[MAXN];

void calcS2(int ind,vector<int>& points,int a,int b){
     int i;
     for(i=2;i<=toppoint[ind];i++){
         int P=i;
         P--;
         if(P>points[a]){
            S[i]=_min(points[a],points[b]-P+points[a]);
         }
         else{
            S[i]=P;
         }
     }
}

void calcS3(int ind,vector<int>& points){
     int i,P;
     for(i=3;i<=toppoint[ind];i++){
         int l=_max(2,i-points[0]);
         int r=_min(i-1,points[1]+points[2]);
         S[i]=(Stemp[r]-Stemp[l-1]+MOD)%MOD;
     }
}

void calcS(vector<int>& points,vector<string>& des,int i){
      int j;
       memset(S,0,sizeof(S));
       if(pnum[i]==0) S[0]=1;
       else if(pnum[i]==1){
          for(j=1;j<=toppoint[i];j++)
             S[j]=1;
       }
       else if(pnum[i]==2){
            if(des[i][0]=='Y'&&des[i][1]=='Y'){
               calcS2(i,points,0,1);
            }
            else if(des[i][0]=='Y'&&des[i][2]=='Y'){
               calcS2(i,points,0,2);
            }
            else{
               calcS2(i,points,1,2);
            }
       }
       else{
            calcS3(i,points);
       }
}


class SRMIntermissionPhase
{
public:
	int countWays(vector <int> points, vector <string> description)
	{
		int n=description.size();
		int i,j,P;
		int sum=0;
		for(i=0;i<n;i++){
            pnum[i]=0;
            sum=0;
            for(j=0;j<3;j++)
              if(description[i][j]=='Y'){pnum[i]++;sum+=points[j];}
            toppoint[i]=sum;
        }
        memset(S,0,sizeof(S));
        memset(Stemp,0,sizeof(Stemp));
        
        //calc S[][]
        for(i=2;i<=points[1]+points[2];i++){
           P=i;
           P--;
           if(P>points[1]){
               Stemp[i]=_min(points[1],points[2]-P+points[1]);
           }
           else{
               Stemp[i]=P;
           }
        }
        for(i=3;i<=points[1]+points[2];i++)
           Stemp[i]=(Stemp[i-1]+Stemp[i])%MOD;
                 
        //calc dp[][]
        memset(dp,0,sizeof(dp));
        memset(pre,0,sizeof(pre));
         calcS(points,description,0);
        for(j=toppoint[0];j>=pnum[0];j--){
          
           dp[0][j]=S[j];
        }
        for(i=1;i<n;i++){
           
           calcS(points,description,i);
           
           pre[MAXN+1]=0;
           for(j=MAXN;j>=0;j--)
              pre[j]=(pre[j+1]+dp[i-1][j])%MOD;
              
           for(j=toppoint[i];j>=pnum[i];j--){
              dp[i][j]=(pre[j+1]*S[j])%MOD;
           }
        }
        long long res=0;
        for(j=toppoint[n-1];j>=pnum[n-1];j--)
           res=(res+dp[n-1][j])%MOD;
        return (int)res;
	}
};


【四轴飞行器】非线性三自由度四轴飞行器模拟器研究(Matlab代码实现)内容概要:本文围绕非线性三自由度四轴飞行器的建模与仿真展开,重点介绍了基于Matlab的飞行器动力学模型构建与控制系统设计方法。通过对四轴飞行器非线性运动方程的推导,建立其在三维空间中的姿态与位置动态模型,并采用数值仿真手段实现飞行器在复杂环境下的行为模拟。文中详细阐述了系统状态方程的构建、控制输入设计以及仿真参数设置,并结合具体代码实现展示了如何对飞行器进行稳定控制与轨迹跟踪。此外,文章还提到了多种优化与控制策略的应用背景,如模型预测控制、PID控制等,突出了Matlab工具在无人机系统仿真中的强大功能。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的高校学生、科研人员及从事无人机系统开发的工程师;尤其适合从事飞行器建模、控制算法研究及相关领域研究的专业人士。; 使用场景及目标:①用于四轴飞行器非线性动力学建模的教学与科研实践;②为无人机控制系统设计(如姿态控制、轨迹跟踪)提供仿真验证平台;③支持高级控制算法(如MPC、LQR、PID)的研究与对比分析; 阅读建议:建议读者结合文中提到的Matlab代码与仿真模型,动手实践飞行器建模与控制流程,重点关注动力学方程的实现与控制器参数调优,同时可拓展至多自由度或复杂环境下的飞行仿真研究。
Memory 计算 Workload Pod 使用 请求 请求 % 限制 限制 % 理论扩容值 建议扩容值(GB) bpmp-java-service-prd bpmp-java-service-prd-66c869d48d-sdjb9 6.74 GiB 3.00 GiB 224.69% 8.00 GiB 84.26% 8.99 GiB 10 srm-java-base-prd srm-java-base-prd-5bb54555fc-57r7d 16.00 GiB 3.00 GiB 533.29% 16.00 GiB 99.99% 21.33 GiB 24 srm-java-base-prd-5bb54555fc-m6qtb 16.00 GiB 3.00 GiB 533.32% 16.00 GiB 100.00% 21.33 GiB srm-java-bizpj-prd srm-java-bizpj-prd-d6f597979-6gphl 30.32 GiB 3.00 GiB 1010.52% 32.00 GiB 94.74% 40.42 GiB 42 srm-java-bizpj-prd-d6f597979-7jztp 29.72 GiB 3.00 GiB 990.51% 32.00 GiB 92.86% 39.62 GiB srm-java-contract-prd srm-java-contract-prd-7887b547d9-9xmcp 2.86 GiB 500.00 MiB 586.59% 2.93 GiB 97.77% 3.82 GiB 4 srm-java-file-prd srm-java-file-prd-8695668d54-bjjd2 7.36 GiB 600.00 MiB 1255.87% 8.00 GiB 91.98% 9.81 GiB 12 srm-java-file-prd-8695668d54-ftf5n 7.44 GiB 600.00 MiB 1269.69% 8.00 GiB 92.99% 9.92 GiB srm-java-file-prd-8695668d54-g56fs 7.61 GiB 600.00 MiB 1298.86% 8.00 GiB 95.13% 10.15 GiB srm-java-file-prd-8695668d54-pw7ll 7.45 GiB 600.00 MiB 1271.01% 8.00 GiB 93.09% 9.93 GiB srm-java-file-prd-8695668d54-xbhnb 7.43 GiB 600.00 MiB 1268.21% 8.00 GiB 92.89% 9.91 GiB srm-java-gateway-prd srm-java-gateway-prd-d5d9956ff-j6mxv 2.67 GiB 500.00 MiB 547.36% 3.00 GiB 89.09% 3.56 GiB 4 srm-java-gateway-prd-d5d9956ff-lfspx 2.64 GiB 500.00 MiB 540.81% 3.00 GiB 88.02% 3.52 GiB srm-java-inq-prd srm-java-inq-prd-85444f8645-pvsgd 2.58 GiB 500.00 MiB 528.06% 3.00 GiB 85.95% 3.44 GiB 4 srm-java-onlineview-prd srm-java-onlineview-prd-7f5f78dbd8-5xsq5 12.28 GiB 500.00 MiB 2514.98% 16.00 GiB 76.75% 16.37 GiB 18 srm-java-ppap-prd srm-java-ppap-prd-6f5d949fd9-mlpwq 2.25 GiB 500.00 MiB 461.09% 3.00 GiB 75.05% 3.00 GiB 4 srm-java-qc-prd srm-java-qc-prd-855bf8d6b5-m6fh2 3.67 GiB 3.00 GiB 122.50% 4.00 GiB 91.87% 4.90 GiB 6 srm-java-rbac-prd srm-java-rbac-prd-8dfbf968f-82v6f 15.66 GiB 3.00 GiB 522.15% 16.00 GiB 97.90% 20.89 GiB 22 srm-java-rbac-prd-8dfbf968f-tzctw 15.55 GiB 3.00 GiB 518.39% 16.00 GiB 97.20% 20.74 GiB 根据上面的信息,帮我写一个扩容原因,请求率太高
07-10
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值