牛客 Bang! Bang!
作者:互联网
题目链接: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