Submission #102140

#TimeUsernameProblemLanguageResultExecution timeMemory
102140MohamedAhmed0K blocks (IZhO14_blocks)C++14
100 / 100
973 ms80848 KiB
#include <bits/stdc++.h>

using namespace std ;

int main()
{
	int n , k ;
	scanf("%d %d" , &n , &k) ;
	int arr[n+1] ;
	for(int i = 1 ; i <= n ; ++i)
		scanf("%d" , &arr[i]) ;
	int dp[n+1][k+1] ;
	int chosen[n+1][k+1] ;
	dp[0][1] = 0 ;
	for(int i = 1 ; i <= n ; ++i)
		dp[i][1] = max(arr[i] , dp[i-1][1]) , chosen[i][1] = dp[i][1];
	for(int j = 2 ; j <= k ; ++j)
	{
		stack<int>s ;
		for(int i = j ; i <= n ; ++i)
		{
			dp[i][j] = dp[i-1][j-1] + arr[i] ;
			chosen[i][j] = arr[i] ;
			while(s.size() > 0)
			{
				int idx = s.top() ;
				if(arr[idx] <= arr[i])
				{
					if(dp[idx][j] - chosen[idx][j] + max(chosen[idx][j] , arr[i]) < dp[i][j])
					{
						dp[i][j] = dp[idx][j] - chosen[idx][j] + max(chosen[idx][j] , arr[i]) ;
					}
					s.pop() ;
				}
				else
					break ;
			}
			if(s.size() > 0)
			{
				int idx = s.top() ;
				if(dp[idx][j] < dp[i][j])
				{
					dp[i][j] = dp[idx][j] ;
                    chosen[i][j] = chosen[idx][j] ;
				}
			}
			s.push(i) ;
		}
	}
	printf("%d" , dp[n][k]) ;
	return 0 ;
}

Compilation message (stderr)

blocks.cpp: In function 'int main()':
blocks.cpp:8:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d" , &n , &k) ;
  ~~~~~^~~~~~~~~~~~~~~~~~~
blocks.cpp:11:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d" , &arr[i]) ;
   ~~~~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...