diff --git a/README.md b/README.md index 2507327..6d2fdd4 100755 --- a/README.md +++ b/README.md @@ -93,4 +93,20 @@ dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]); dp[i][j]=dp[i][j-1]+(a[i]!=a[j]); dp[i][i]=1; */ +``` +### [oj8782](http://noi.openjudge.cn/ch0206/8782) +```cpp +/* +区间动态规划解题步骤: +1.根据问题推测dp[i][j]的含义 +问题:长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分 +dp[i][j]的含义:长度为i的数字串,要求选手使用j个乘号将它分成j+1个部分 + +2.根据规则推出dp[i][j]的状态转移公式 +在1-i之间找一个中间值k,将1-i这一段分成两段1-k(有j-1个乘号)和k+1~i(没有乘号) +dp[i][j]=max(dp[i][j],dp[k][j-1]*num[k+1][i]); + +3.边界问题(比如设定dp[0][0],dp[0][j],dp[i][0]初始值) +num[i][j] +*/ ``` \ No newline at end of file diff --git a/src/oj8782/oj8782.cpp b/src/oj8782/oj8782.cpp new file mode 100644 index 0000000..9748d95 --- /dev/null +++ b/src/oj8782/oj8782.cpp @@ -0,0 +1,46 @@ +#include +using namespace std; +/* +区间动态规划解题步骤: + 1.根据问题推测dp[i][j]的含义 + 问题:长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分 + dp[i][j]的含义:长度为i的数字串,要求选手使用j个乘号将它分成j+1个部分 + + 2.根据规则推出dp[i][j]的状态转移公式 + 在1-i之间找一个中间值k,将1-i这一段分成两段1-k(有j-1个乘号)和k+1~i(没有乘号) + dp[i][j]=max(dp[i][j],dp[k][j-1]*num[k+1][i]); + + 3.边界问题(比如设定dp[0][0],dp[0][j],dp[i][0]初始值) + num[i][j] +*/ +#define NV(v)#v<<" : "<<(v) +using ll = long long; + +const ll max_n = 40+5; +ll n,k, num[max_n][max_n],dp[max_n][max_n]; +char c[max_n]; + +int main(){ + cin>>n>>k; + for(ll i{1};i<=n;i++){ + cin>>c[i]; + } + for(ll i{1};i<=n;i++){ + num[i][i]=c[i]-'0'; + for(ll j{i+1};j<=n;j++){ + num[i][j]=num[i][j-1]*10+c[j]-'0'; + // cout<