P6103 [EER2]直接自然溢出啥事没有:我语文不好,dp也不好

链接: P6103 [EER2]直接自然溢出啥事没有
出题人的语文很好吗?整篇阅读理解给我们做!整个都搞晕了,在题解的帮助下,画个图理解下。

连接
+2
+0
+2+4
+2
+0+2
+2
+1
语句
片段
语句块
函数

设:
dp[i][0]为语句数;
dp[i][1]为程序片段数; d p [ i ] [ 1 ] = ∑ j = 0 i − 1 d p [ j ] [ 1 ] ∗ d p [ i − j ] [ 0 ] dp[i][1]= \sum_{j=0}^{i-1}dp[j][1]*dp[i-j][0] dp[i][1]=j=0i1dp[j][1]dp[ij][0]
dp[i][2]为语句块; d p [ i ] [ 2 ] = d p [ i − 2 ] [ 1 ] dp[i][2]=dp[i-2][1] dp[i][2]=dp[i2][1]
dp[i][3]为函数; d p [ i ] [ 3 ] = d p [ i − 2 ] [ 3 ] + d p [ i − 2 ] [ 2 ] + d p [ i − 4 ] [ 2 ] dp[i][3]=dp[i-2][3]+dp[i-2][2]+dp[i-4][2] dp[i][3]=dp[i2][3]+dp[i2][2]+dp[i4][2]
dp[i][4]为值; d p [ i ] [ 4 ] = d p [ i ] [ 3 ] + d p [ i − 2 ] [ 3 ] + d p [ i − 2 ] [ 4 ] dp[i][4]=dp[i][3]+dp[i-2][3]+dp[i-2][4] dp[i][4]=dp[i][3]+dp[i2][3]+dp[i2][4]
dp[i][0]: d p [ i ] [ 0 ] = d p [ i ] [ 2 ] + d p [ i − 1 ] [ 4 ] dp[i][0]=dp[i][2]+dp[i-1][4] dp[i][0]=dp[i][2]+dp[i1][4]
因为已知条件为dp[0][1]=1;dp[1][0]=1;dp[1][1]=1;
所以长度为0和1的语句与片段,后续循环中的的求解顺序为:语句块dp[][2]>函数dp[][3]>值dp[][4]>语句dp[][0]>片段dp[][1];
参考代码:

//copy tj 
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef unsigned long long ull;
ull n, dp[100010][5];

int main(){
    cin>>n;
    dp[0][1] = dp[1][0] = dp[1][1] = 1;
    for(int i = 2; i <= n; ++i){//要求的是dp[][1] ;
    	dp[i][2] = dp[i - 2][1];//语句块由判断得来 
        dp[i][3] = dp[i - 2][2] + dp[i - 2][3];//语句块+2,函数+2得到函数 
        if(i >= 4) dp[i][3] += dp[i - 4][2];//语句块+2+4得到函数 
        dp[i][4] = dp[i][3] + dp[i - 2][4];//注意这里
        dp[i][0] = dp[i][2] + dp[i - 1][4]; 
        for(int j = 0; j < i; ++j) dp[i][1] += dp[j][1] * dp[i - j][0];//根据上述情况模拟
    }
    cout<<dp[n][1]<<endl;
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值