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;
}
//
#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
- ACM学习-动态规划-三角形最大面积问题
- 【动态规划】UVa 1331 最大面积最小三角形剖分
- 动态规划学习(1)-数字三角形问题
- 二维数组最大面积的问题(动态规划)
- ACM-动态规划21-三角形最长路径问题
- 经典动态规划基础题-三角形最大和问题
- 算法学习之动态规划--数字三角形最大路径和
- ACM学习-动态规划-背包问题
- ACM学习-动态规划-子问题编码
- ACM学习-动态规划-取数字问题
- ACM学习-动态规划-购物问题
- ACM学习-动态规划-物品供应问题
- ACM学习-动态规划-电子眼问题
- ACM学习-动态规划-复制书稿问题
- ACM学习-动态规划-采购计划问题
- ACM学习-动态规划-巡回演出问题
- ACM学习-动态规划-文本压缩问题
- 【枚举】求三角形最大面积问题
- 游戏模型模糊高亮边缘效果实现shader
- hdu 5501
- light1239 - Convex Fence【凸包】
- codeforces 584E
- usaco月赛trapped
- ACM学习-动态规划-三角形最大面积问题
- Android 双击返回键退出功能的实现
- zookeeper介绍(一)
- iOS音频录制基础
- 二、风险和收益成正比
- 游戏开发设计模式之命令模式(unity3d 示例实现)
- [51MCU] Chapter1:芯片引脚
- BufferedReader的用法
- 友元函数