1 solutions
-
-4
还没写完
先放代码再解释
#include<bits/stdc++.h> using namespace std; int dp[41][100001]; int num[41][100001];int len=0,n; string s; int main(){ cin>>s>>n; len=s.size(); memset(dp,0x3f3f3f3f,sizeof dp); for(int i=1;i<=len;i++)num[i][i]=s[i-1]-'0'; for(int i=1;i<=len;i++){ for(int j=i+1;j<=len;j++){ if(0LL+num[i][j-1]*10+s[j-1]-'0'>100000)num[i][j]=100010; else num[i][j]=num[i][j-1]*10+s[j-1]-'0'; } } dp[0][0]=-1; for(int i=1;i<=len;i++){ for(int k=0;k<=n;k++){ for(int j=i-1;j>=0;j--){ if(k>=num[j+1][i]&&num[j+1][i]<=100000){ dp[i][k]=min(dp[i][k],dp[j][k-num[j+1][i]]+1); } } } } if(dp[len][n]<40&&dp[len][n]>=0)cout<<dp[len][n]; else cout<<"-1"; return 0; }
解释:
1、num数组
num[i][j]表示第i个到第j个表示的数
例如:
- 1
Information
- ID
- 841
- Time
- 1000ms
- Memory
- 500MiB
- Difficulty
- 3
- Tags
- # Submissions
- 69
- Accepted
- 4
- Uploaded By