ACM学习-动态规划-三角形最大面积问题

来源:互联网 发布:怎么在淘宝买伟哥 编辑:程序博客网 时间:2024/05/19 22:48
// ACM学习-动态规划-三角形最大面积问题.cpp : 定义控制台应用程序的入口点。
//


#include "stdafx.h"
#include<iostream>
#include<queue>
#include<string>
using namespace std;


int n;//三角形的层数
int data[100][100];
int num[100][100] = {0};
int num1[100][100] = { 0 };
int index = 0;
int cur = 1;
int edge[9][9]{
{ 1, 0, 0, 0, 0, 0, 0, 0, 0 },
{1, 0, 1, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 0, 1, 0, 0, 0, 0 },
{ 1, 1, 1, 1, 1, 0, 1, 0, 0 },
{ 0, 1, 0, 0, 1, 1, 1, 1, 0 }






};
void change1(){
for (int i = 1; i <= n; i++){
int temp = 2 * i - 1;
for (int j = 1; j <= temp; j++){
num[i][j] = num1[i][j];
}
}
}
void change0(){
for (int i = 1; i <= n; i++){
int temp = 2 * i - 1;
for (int j = 1; j <= temp; j++){
num1[i][j] = num[i][j];
}
}
}
void work(){
int count = 3;
while (count>=3){
count = 0;
if (index == 0){
for (int i = 1; i <= n; i++){
int temp = 2 * i - 1;
for (int j = 1; j <= temp; j++){
if (num[i][j]>=cur){
if (j % 2 != 0){
if (num[i][j] == 1){
if (i + 1 <= n){
if (num[i + 1][j] == num[i][j]
&& num[i + 1][j+1] == num[i][j]
&& num[i + 1][j+2] == num[i][j])
{
num1[i][j]++;
count++;
}
}
}
else{
if (i + 1 <= n){
if (num[i + 1][j] == num[i][j]
&& num[i + 1][j + 2] == num[i][j])
{
num1[i][j]++;
count++;
}
}
}
}
else{
if (i >= 4&&j>=4&&j<=temp-3){

if (num[i][j] == 1){
if (num[i - 1][j] == num[i][j]
&& num[i - 1][j-1] == num[i][j]
&& num[i - 1][j-2] == num[i][j])
{
num1[i][j]++;
}
}
else{
if (num[i - 1][j] == num[i][j]
&& num[i - 1][j - 2] == num[i][j])
{
num1[i][j]++;
}


}



}
}


}
}
}
change1();
}
else{
for (int i = 1; i <= n; i++){
int temp = 2 * i - 1;
for (int j = 1; j <= temp; j++){
if (num1[i][j]>=cur){
if (j % 2 != 0){
if (num1[i][j] == 1){
if (i + 1 <= n){
if (num1[i + 1][j] == num1[i][j]
&& num1[i + 1][j + 1] == num1[i][j]
&& num1[i + 1][j + 2] == num1[i][j])
{
num[i][j]++;
count++;
}
}
}
else{
if (i + 1 <= n){
if (num1[i + 1][j] == num1[i][j]
&& num1[i + 1][j + 2] == num1[i][j])
{
num[i][j]++;
count++;
}
}
}
}
else{
if (i >= 4 && j >= 4 && j <= temp - 3){
if (num1[i][j] == 1){
if (num1[i - 1][j] == num1[i][j]
&& num1[i - 1][j - 1] == num1[i][j]
&& num1[i - 1][j - 2] == num1[i][j])
{
num[i][j]++;
}
}
else{
if (num1[i - 1][j] == num1[i][j]
&& num1[i - 1][j - 2] == num1[i][j])
{
num[i][j]++;
}


}



}
}


}
}
}
change0();
}
index = (index + 1) % 2;
cur++;
}




}
void work1(){
int count = 3;
while (count >= 3){
count = 0;//成功找到的个数
for (int i = 1; i <= n; i++){
int temp = 2 * i - 1;
for (int j = 1; j <= temp; j++){
if (num[i][j] >= cur){
if (j % 2 != 0){
if (num[i][j] == 1){
if (i + 1 <= n){
if (num[i + 1][j] == num[i][j]
&& num[i + 1][j + 1] == num[i][j]
&& num[i + 1][j + 2] == num[i][j])
{
num[i][j]++;
count++;
}
}
}
else{
if (i + 1 <= n){
if (num[i + 1][j] == num[i][j]
&& num[i + 1][j + 2] == num[i][j])
{
num[i][j]++;
count++;
}
}
}
}
else{
if (i >= 4 && j >= 4 && j <= temp - 3){


if (num[i][j] == 1){
if (num[i - 1][j] == num[i][j]
&& num[i - 1][j - 1] == num[i][j]
&& num[i - 1][j - 2] == num[i][j])
{
num[i][j]++;
}
}
else{
if (num[i - 1][j] == num[i][j]
&& num[i - 1][j - 2] == num[i][j])
{
num[i][j]++;
}


}




}
}


}
}
}
cur++;
}




}
int _tmain(int argc, _TCHAR* argv[])
{
int max;
memset(data, 0xff, sizeof(data));
n = 5;
for (int i = 1; i <= n; i++){
int temp = 2 * i - 1;
for (int j = 1; j <= temp; j++){
//cin >> data[i][j];
data[i][j] = edge[i - 1][j - 1];
if (data[i][j])num1[i][j]=num[i][j] = 1;
}
}
work1();
/*max = 0;
for (int i = 1; i <= n; i++){
int temp = 2 * i - 1;
for (int j = 1; j <= temp; j++){
if (num1[i][j] > max)max = num1[i][j];
}
}
cout << "num1:  " << max << endl;*/
max = 0;
for (int i = 1; i <= n; i++){
int temp = 2 * i - 1;
for (int j = 1; j <= temp; j++){
if (num[i][j] > max)max = num[i][j];
}
}



cout <<"num:  "<< max << endl;




return 0;
}

0 0
原创粉丝点击