Codeforces 1005D(dp)
3552 단어 CodeForces사유dp
제목:
D. Polycarp and Div 3
time limit per test
3 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
Polycarp likes numbers that are divisible by 3.
He has a huge number ss. Polycarp wants to cut from it the maximum number of numbers that are divisible by 33. To do this, he makes an arbitrary number of vertical cuts between pairs of adjacent digits. As a result, after mm such cuts, there will be m+1m+1 parts in total. Polycarp analyzes each of the obtained numbers and finds the number of those that are divisible by 33.
For example, if the original number is s=3121s=3121, then Polycarp can cut it into three parts with two cuts: 3|1|213|1|21. As a result, he will get two numbers that are divisible by 33.
Polycarp can make an arbitrary number of vertical cuts, where each cut is made between a pair of adjacent digits. The resulting numbers cannot contain extra leading zeroes (that is, the number can begin with 0 if and only if this number is exactly one character '0'). For example, 007, 01 and 00099 are not valid numbers, but 90, 0 and 10001 are valid.
What is the maximum number of numbers divisible by 33 that Polycarp can obtain?
Input
The first line of the input contains a positive integer ss. The number of digits of the number ss is between 11 and 2⋅1052⋅105, inclusive. The first (leftmost) digit is not equal to 0.
Output
Print the maximum number of numbers divisible by 33 that Polycarp can get by making vertical cuts in the given number ss.
Examples
input
Copy
3121
output
Copy
2
input
Copy
6
output
Copy
1
input
Copy
1000000000000000000000000000000000
output
Copy
33
input
Copy
201920181
output
Copy
4
Note
In the first example, an example set of optimal cuts on the number is 3|1|21.
In the second example, you do not need to make any cuts. The specified number 6 forms one number that is divisible by 33.
In the third example, cuts must be made between each pair of digits. As a result, Polycarp gets one digit 1 and 3333 digits 0. Each of the 3333digits 0 forms a number that is divisible by 33.
In the fourth example, an example set of optimal cuts is 2|0|1|9|201|81. The numbers 00, 99, 201201 and 8181 are divisible by 33.
제목 설명:
문자열을 드리겠습니다. 이 문자열을 임의의 부분으로 잘라서, 최대 몇 개의 부분을 0 으로 만들 수 있는지 물어보십시오.
제목 분석:
이 문제에 대해 말하자면, 우리는 뒷수의 답안이 앞의 수에서 넘어올 수 있다는 것을 발견했기 때문에, 우리는 dp로 문제를 해결하는 것을 고려할 수 있다.
먼저 dp[i]와 f[s]를 만들어 전 i개 문자열에서 얻을 수 있는 조건에 가장 많은 개수를 나타낸다. f[s]는 한 자릿수에%3의 나머지를 s로 더한 수에서 조건에 가장 많은 개수를 얻는 것을 의미한다.
한 사람의 개수가 0일 때 가장 좋은 방안은 0을 단독으로 나머지로 하는 것이기 때문이다.이때 dp[i]=dp[i-1]+1이 있습니다.한 사람의 수가 0이 되지 않을 때 dp[i]=max(dp[i-1]+f[x]+1).
이 상태에서 방정식을 옮기면 쓸 수 있다.
코드:
#include
#define maxn 200005
using namespace std;
int dp[maxn],f[maxn];
char str[maxn];
int main()
{
scanf("%s",str+1);
int len=strlen(str+1);
f[1]=f[2]=-0x3f3f3f3f;
for(int i=1,s=0;i<=len;i++){
s=(s+str[i]-'0')%3;
if(str[i]=='0') dp[i]=dp[i-1]+1;
else dp[i]=max(dp[i-1],f[s]+1);
f[s]=max(f[s],dp[i]);
}
cout<
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
문제 풀이 보고서 의 CodeForces 91B QueueOtherwise, print the i-th walrus's displeasure: the number of other walruses that stand between him and the furthest fro...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.