[참혹한 교훈] noip 2000 증가 - 승적 최대


제목: 길이가 n인 숫자열을 정하고 k개의 곱셈을 삽입하는 최대 곱셈을 구합니다
N,K(6≤N≤40,1≤K≤6,6≤N≤40,1≤K≤6)
물이 많은 구간 dp, dp[i][j]를 설정하면 전 i위에 j개의 곱셈을 삽입하는 최대 곱셈을 나타낸다.
초기 상태:
dp[i][0]=submit(1,i); (submit(l, r)은 원래 숫자 문자열이 l에서 r까지의 문자열을 나타낸다)
마지막 곱셈을 열거하는 위치를 고려하면 전이 방정식이 있다.

dp[i][j]=max(dp[i][j],dp[k][j-1]   *   submit(k+1,i))


제j번 여기 있어요.
그 다음은 고정밀의 문제다.
그러나 나는 두 개의 수조를 비교하는 데 있어서 잘못 쳤다
​bool ifmax(int a[],int b[])
{
	int l1=a[0],l2=b[0];
	if(l1>l2) return true;
	if(l1=1;i--) 
	if(a[i]>b[i]) return true; else return false;
    return false;
}

이것은 나의 원래 타법이다. a[i]=b[i]에서 나도returnfalse를 쳤는데 아주 작은 문제였다. 그러나 나는 몇 시간 동안 조정했다.

앞으로if문장에서 조건을 판단하는else와 취등상황에 주의하세요!!!


 
​
#include
#include
#include
#include
#define MAXN 100
#define MAXM 10
using namespace std;
int n,m;
char s[MAXN];
int f[MAXN][MAXN][MAXN];
void cut(int a[],int l,int r)
{
	int k=0;
	for(int i=r-1;i>=l-1;i--) 
	{
		k++;
		a[k]=s[i]-'0';
	}
	a[0]=k;
}
void multiply(int ans[],int a[],int b[])
{
	int l1=a[0];
	int l2=b[0];
	for(int i=1;i<=l1;i++)
	 for(int j=1;j<=l2;j++)
	 {
	 	ans[i+j-1]+=a[i]*b[j];
	 }
	for(int i=1;i<=l1+l2-1;i++)
	{
		if(ans[i]>=10)
		{
			ans[i+1]+=ans[i]/10;
			ans[i]%=10;
		}
	}
	ans[0]=l1+l2;
	while(ans[ans[0]]==0&&ans[0]>1) ans[0]--; 
	
}
bool ifmax(int a[],int b[])
{
	int l1=a[0],l2=b[0];
	if(l1>l2) return true;
	if(l1=1;i--) 
	if(a[i]>b[i]) return true; 
	else if(a[i]>n>>m;
	cin>>s;
	for(int i=0;i=1;i--) cout<

좋은 웹페이지 즐겨찾기