标签:int ll long 牛客 Bang 1010 dp mod
题目链接:https://ac.nowcoder.com/acm/contest/9716/B
思路: 根据数据范围和题意 很容易看出是dp
主要是 边界的处理是 无效状态的去除 dp[i][j][0/1] 代表 前i个字符有j个重音节 且当前是/否 重音节
对于当前音符 可以是重音符也可以不是 不是的时候 dp[i][j][0]=dp[i-1][j][1]+dp[i-1][j][0]
是的时候 一般状态下是 dp[i][j][1]=dp[i-k-1][j-1][1]+dp[i-k-1][j-1][0] 即隔了k个的位置
特判 j==1的时候 就可以不受限制在任意位置放 dp[i][1][1]=1
为了 方便 初始化i=1 然后让i=2开始dp
1 class Solution { 2 public: 3 4 #define ll long long 5 ll dp[1010][1010][2]; 6 const int mod=1e9+7; 7 long long solve_bangbang(int n, int m, int k) { 8 // write code here 9 dp[1][1][1]=dp[1][0][0]=1; 10 for(int i=1;i<=n;i++) 11 { 12 dp[i][0][0]=1; 13 } 14 for(int i=2;i<=n;i++) 15 { 16 for(int j=1;j<=i;j++) 17 { 18 dp[i][j][0]=dp[i-1][j][0]+dp[i-1][j][1]; 19 dp[i][j][0]%=mod; 20 21 if(j==1) 22 { 23 dp[i][j][1]=1; 24 } 25 else 26 { 27 if(i-k-1>=1) 28 dp[i][j][1]=dp[i-k-1][j-1][0]+dp[i-k-1][j-1][1]; 29 } 30 dp[i][j][1]%=mod; 31 } 32 } 33 ll ans=dp[n][m][0]+dp[n][m][1]; 34 ans%=mod; 35 return ans; 36 } 37 };View Code
贴一份错误代码 主要是i-k-1<1 的判断时 不一定方案数一定有1
1 class Solution { 2 public: 3 4 #define ll long long 5 ll dp[1010][1010][2]; 6 const int mod=1e9+7; 7 long long solve_bangbang(int n, int m, int k) { 8 // write code here 9 dp[1][1][1]=dp[1][0][0]=1; 10 for(int i=1;i<=n;i++) 11 { 12 dp[i][0][0]=1; 13 } 14 for(int i=2;i<=n;i++) 15 { 16 for(int j=1;j<=i;j++) 17 { 18 dp[i][j][0]=dp[i-1][j][0]+dp[i-1][j][1]; 19 dp[i][j][0]%=mod; 20 if(i-k>=1) 21 dp[i][j][1]=dp[i-k][j-1][0]; 22 else // 错了 因为把无效状态变成了1 23 dp[i][j][1]=1; 24 dp[i][j][1]%=mod; 25 } 26 } 27 ll ans=dp[n][m][0]+dp[n][m][1]; 28 ans%=mod; 29 return ans; 30 } 31 };View Code
标签:int,ll,long,牛客,Bang,1010,dp,mod 来源: https://www.cnblogs.com/winfor/p/14089199.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。