题目链接如下:

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;}
};

SRM520 DIVI-500pts相关推荐

  1. 页面转发后文本显示???_使用Divi的滑动动画显示过程的进度

    欢迎来到这个由6章组成的系列的第3章,它将教你如何使用Divi的新"动画"选项设计出色的页面板块.我将向你介绍如何构建实时演示页面的不同部分,以向你展示向网站添加动画的技术.动画功 ...

  2. 控件设置相对位置_惊人的Divi转换控件!

    Divi的变换控件释放了许多新的设计可能你可以使用一系列新设计选项来执行惊人的设计,而到目前为止,只有在诸如Photoshop之类的图形设计程序中才可以这样操作.Divi引入了一项全新功能,该功能允许 ...

  3. divi模板下载_Java Math类静态double IEEEremainder(double divi,double divisor)的示例

    divi模板下载 数学类静态double IEEEremainder(double divi,double divisor) (Math Class static double IEEEremaind ...

  4. 如何用divi主题做独立站?

    加入我们的Divi主题中文社群,一起分享经验.交流技巧.提高技能! 您在使用Divi主题吗?那就快快加入我们的社群,与其他Divi爱好者一起交流经验! 加入我们的Divi主题中文社群,获得最新的Div ...

  5. divi 相关主题推荐

    Divi是一款由Elegant Themes公司推出的WordPress主题和插件.它提供了一系列功能强大的工具,帮助用户快速轻松地创建美观的网站.Divi提供了丰富的预设模板和设置选项,可以让用户快 ...

  6. divi模板下载_适用于任何WordPress主题的Divi Builder插件

    divi模板下载 As a WordPress user and developer, I can definitely say that I am into frameworks. I like t ...

  7. DIVI主题很快吗?

    Divi主题提供了一个完整的可视化布局建造器,可以让用户轻松地创建专业网站.它还包含许多预先构建的布局模板和元素,供用户选择,可以节省时间并确保一致的设计风格. Divi主题的一个主要优点是它的灵活性 ...

  8. divi模板下载_Divi:拖放式WordPress主题

    divi模板下载 Not everyone who uses WordPress is a web designer or developer. In fact, understanding how ...

  9. divi模板下载_Divi WordPress主题:更改博客方式

    divi模板下载 If you aren't familiar with Divi, it's a WordPress theme I covered a while back. The Divi W ...

  10. 什么是Divi主题生成器?

    加入我们的Divi主题中文社群,一起分享经验.交流技巧.提高技能! 您在使用Divi主题吗?那就快快加入我们的社群,与其他Divi爱好者一起交流经验! 加入我们的Divi主题中文社群,获得最新的Div ...

最新文章

  1. 先使用皮尔逊相似性特征选择来训练随机森林
  2. Android开发之Handler的使用方法(源代码分享)
  3. hibernate.hbm2ddl.auto配置详解
  4. Qt Creator查找和更换
  5. poj 2507Crossed ladders 计算几何
  6. php根据地理位置签到,微信小程序获取地理位置实现定位签到功能
  7. Android Fragment手柄后退按钮按下[重复]
  8. Python 这么简单还用学吗?
  9. 数码相片冲印尺寸对照表
  10. python安卓吾爱_python编程视频教程v1.0.0下载_Python编程安卓版下载_吾爱游戏网
  11. typora 主题下载及安装
  12. 科普:论文上附有的 arXiv 是干嘛的
  13. 软考——系统架构设计师工作日志
  14. 寒假水67——空心三角形
  15. 淘宝滑块 tb滑块 x82y x5sec
  16. NLP-生成模型-2019:TransformerXL【对Vanilla Transformer的改进:片段级递归机制、相对位置编码】【超出固定长度上下文的注意力语言模型】
  17. LTE入门篇-6:MIMO多天线技术
  18. 2020,互联网大变天
  19. 网站分析实战——如何以数据驱动决策:提升网站价值
  20. 【PHP自学笔记】变量的命名规则和变量作用域

热门文章

  1. JCJC错别字检测新功能:检测日期格式
  2. Layui+Servlet+MyBatis+Mysql实现的大学生创新竞赛管理平台
  3. (02)Cartographer源码无死角解析-(50) 2D点云扫描匹配→相关性暴力匹配2:RealTimeCorrelativeScanMatcher2D
  4. hx711芯片c语言程序,压力传感器HX711的C函数
  5. 学习笔记:《数字媒体技术概论》-4/10 数字语音信号处理技术及应用-中国大学慕课公开课
  6. Ubuntu 自带输入法fcitx配置!!!
  7. Ubuntu1804键盘输入系统无fcitx的解决方法
  8. OpenLayers5在EPSG:4326下以m为单位画圆
  9. android 控件布局(顶部、底部......) 留着自己用
  10. 引入文件报错的解决方法(bootstrap+jquery项目)